[PHP] SOAP WSDL & Multidimentional arrays?

Pagina: 1
Acties:
  • 129 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Helza
  • Registratie: Maart 2003
  • Laatst online: 11-09 16:01
Ik heb een probleem met PHP SOAP & multidimentionale arrays.
Ik krijg het maar niet voor elkaar om de correctly WSDL structuur te creeren die bij mijn multidimensionale array hoort.


De array:
code:
1
2
3
4
5
6
7
8
9
  $data = array(
    'somestring' => 'somedata',
    'somevalue' => 1200,
    'dimarray' => array(
      '2' => array('id' => 2, 'anotherstring' => 'xxx', 'value' => 43),
      '12' => array('id' => 12, 'anotherstring' => 'xxx', 'value' => 34),
      '3' => array('id' => 3, 'anotherstring' => 'xxx', 'value' => 54),
    )
  );


De dimarray bevat een aantal associative array items. Ik weet echter niet de keys van te voren die ik in de dimarray stop (wel de structuur van de array die daar inzit), de eerste keys zijn ook niet belangrijk.

Ik krijg het echter niet voor elkaar om een WSDL te schrijven die deze mutidemensionale array correct beschrijft. telkens wordt het een AnyType als ik het pakketje ontvang op C#/JAVA omdat ik de structuur niet goed beschreven krijg. Welke ik dus vervolgens niet goed kan verwerken in die talen omdat ik dan zelf de AnyType XML moet gaan parsen.


dat gebeurt dus met de volgende wsdl specificatie:

code:
1
<s:element name="dimarray" />



code:
1
<s:element name="q" type="soapenc:Array" soapenc:arrayType="s:ur-type"></s:element>


Dit lijkt al veel beter te gaan want ik krijg nu wel een array terug, maar daarbinnen zijn de elementen dus weer AnyTypes :(

Ik probeer dit nu al een week uit te vogelen maar kom er dus niet achter :(


Mijn WSDL:


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions
  xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns:s="http://www.w3.org/2001/XMLSchema"
  xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:tns="mywebserver"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  targetNamespace="http://soap.q-go.net/soap_client/wsdl/schema"
>
    <wsdl:types>
        <s:schema elementFormDefault="qualified" targetNamespace="http://mywebserver">
            <s:element name="SOAP_call">
                <s:complexType>
                    <s:all>
                        <s:element name="function" type="s:string"/>
                        <s:element name="param1" type="s:string"/>
                        <s:element name="param2" type="s:string"/>
                    </s:all>
                </s:complexType>
            </s:element>
            <s:element name="SOAP_callResponse">
                <s:complexType>
                    <s:all>
                        <s:element name="somestring" type="s:string"/>
                        <s:element name="somevalue" type="s:int" minOccurs="0"/>
                        <s:element name="dimarray" />
                    </s:all>
                </s:complexType>
           </s:element>            
        </s:schema>
    </wsdl:types>
    <wsdl:message name="callRequest">
        <wsdl:part name="SOAP_call" element="tns:SOAP_call"/>
    </wsdl:message>
    <wsdl:message name="callResponse">
        <wsdl:part name="SOAP_callResponse" element="tns:SOAP_callResponse"/>
    </wsdl:message>
    
    <wsdl:portType name="PortType">
        <wsdl:operation name="SOAP_call">
            <wsdl:input message="tns:callRequest"/>
            <wsdl:output message="tns:callResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    
    <wsdl:binding name="SoapBinding" type="tns:PortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="SOAP_call">
            <soap:operation soapAction="http://mywebservice/wsdl/SOAP_call" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    
    <wsdl:service name="Service">
        <wsdl:port name="Port" binding="tns:SoapBinding">
            <soap:address location="http://localhost/soap_test.php"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

Acties:
  • 0 Henk 'm!

  • Helza
  • Registratie: Maart 2003
  • Laatst online: 11-09 16:01
heeft niemand een idee? :(

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Je moet dat element als array van de types in kwestie definieren. Nu definieer je niets en het kan moeilijk automagisch goed gaan.

{signature}


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Ik gebruik altijd
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
   <xsd:complexType name="catalogueList">
        <xsd:sequence>
            <xsd:element name="catalogues" type="bsdc:catalogue"
                minOccurs="0" maxOccurs="unbounded" />          
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="catalogue">
        <xsd:sequence>
            <xsd:element name="catalogueID" type="xsd:int" />
            <xsd:element name="description" type="xsd:string" />
        </xsd:sequence>
    </xsd:complexType>

En definieer dan een element met type 'catalogueList' en dan weer een message op basis van dat element. De reden dat ik geen complexTypes in elements nest en niet direct messages definieer op basis van xsd-types, is dat sommige SOAP implementaties daar niet zo lekker mee om lijken te gaan. Dit is in geval van document:literal, zonder array-wrapping.

[ Voor 11% gewijzigd door Confusion op 07-11-2007 13:37 ]

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • Helza
  • Registratie: Maart 2003
  • Laatst online: 11-09 16:01
Thanks that werkte inderdaad, ik had al zelf een vergelijkbaar iets geprobeerd maar dat werkte niet. Het bleek dat als je de array keys iets zijn van 000203 de PHP soap server over zijn nek ging en die elementen dan leeg liet.
Toen ik hier eenmaal achter was was het simpel op te lossen.

[ Voor 6% gewijzigd door Helza op 08-11-2007 11:40 ]