Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SOAP WSDL Associative Arrays

How can I define an associative array in a SOAP wsdl file? This is how I define an array element type so far:

<wsdl:types>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="webservice.wsdl" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
        <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
        <xsd:complexType name="ArrayOfString">
            <xsd:complexContent>
                <xsd:restriction base="soapenc:Array">
                    <xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="tns:arrayElement"/>
                </xsd:restriction>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:schema>
</wsdl:types>

Thanks!


I'm talking about PHP associative arrays, and I want to use any number of any key=>value string pairs, that will be converted back to associative arrays on the other side of the communication party. As an alternative, I could send the serialized array, or json representation as string, but I'd like to know how to do this in wsdl also.

Thanks!

like image 376
Adi Avatar asked Mar 06 '09 12:03

Adi


3 Answers

to transfer a php associative array over soap you will need to define following in your wsdl:

<xsd:complexType name="KeyValueData">
      <xsd:sequence>
        <xsd:element minOccurs="1" maxOccurs="1" name="id" type="string"/>
        <xsd:element minOccurs="1" maxOccurs="1" name="name" type="string"/>
        <xsd:element minOccurs="1" maxOccurs="1" name="data" type="string"/>
      </xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ArrayOfKeyValueData">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded"
               name="keyval" type="tns:KeyValueData"/>
    </xsd:sequence>
</xsd:complexType> 

now specify your new defined ArrayOfKeyValueData type as the type of your result or as parameter

<message name='getPostStatsResponse'>
  <part name='Result' type='ArrayOfKeyValueData'/>
</message>

and specify your operation with someting like

<operation name='getPostStats'>
    <input message='tns:getPostStatsRequest'/>
    <output message='tns:getPostStatsResponse'/>
</operation>

this will work fine with some kind of web service written in php that returns something like

return array("k1" => "v1", "k2" => "v2");

if you are using php as client, you will get exactly the same array on the client side. other languges or soap libraries may produce other structure, as not every language has this kind of "associative array" concept.

like image 143
Jeff Avatar answered Nov 01 '22 09:11

Jeff


WSDL cannot describe the associative nature of an associative array. The best you could do would be to define an array of name/value.

Can you define a PHP service with an operation that returns an associative array, then see what WSDL that produces? You could then follow the same pattern in your own, hand-written WSDLs.

like image 2
John Saunders Avatar answered Nov 01 '22 09:11

John Saunders


If you want to use an array of strings you may just declare in the type that needs the array:

<xs:complexType name="SomeTypeThatUsesAnArrayOfStrings">
    <xs:sequence>
        <xs:element name="TheStringValue" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>

And by the way, what do you mean with "associative array"? something like a c++ map or a python dictionary?

like image 1
Paolo Tedesco Avatar answered Nov 01 '22 09:11

Paolo Tedesco