SOAP WSDL Ассоциативные массивы - PullRequest
7 голосов
/ 06 марта 2009

Как я могу определить ассоциативный массив в файле wsdl SOAP? Вот как я пока определяю тип элемента массива:

<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>

Спасибо! * * 1004


Я говорю о ассоциативных массивах PHP , и я хочу использовать любое количество пар строк ключ => значение, которые будут преобразованы обратно в ассоциативные массивы на другой стороне коммуникационной стороны. , В качестве альтернативы я мог бы отправить сериализованный массив или представление json в виде строки, но я хотел бы знать, как это сделать также в wsdl.

Спасибо!

Ответы [ 3 ]

9 голосов
/ 20 ноября 2011

для переноса ассоциативного массива php через мыло, вам нужно определить следующее в вашем 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> 

теперь укажите ваш новый определенный тип ArrayOfKeyValueData в качестве типа вашего результата или в качестве параметра

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

и укажите операцию с чем-то вроде

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

это будет нормально работать с неким веб-сервисом, написанным на php, который возвращает что-то вроде

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

если вы используете php в качестве клиента, вы получите точно такой же массив на стороне клиента. другие языки или мыльные библиотеки могут создавать другую структуру, поскольку не каждый язык имеет такую ​​концепцию «ассоциативного массива».

2 голосов
/ 06 марта 2009

WSDL не может описать ассоциативный характер ассоциативного массива. Лучшее, что вы могли бы сделать, это определить массив имя / значение.

Можете ли вы определить службу PHP с помощью операции, которая возвращает ассоциативный массив, и посмотреть, что создает WSDL? Затем вы можете следовать той же схеме в своих собственных рукописных WSDL.

1 голос
/ 06 марта 2009

Если вы хотите использовать массив строк, вы можете просто объявить в типе, который требует массив:

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

И, кстати, что вы имеете в виду под "ассоциативным массивом"? что-то вроде карты С ++ или словаря Python?

...