2009-03-06 11 views
7

Come definire un array associativo in un file wsdl SOAP? Questo è il modo in cui definisco un tipo di elemento di array finora:Array associativi SOAP WSDL

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

Grazie!


sto parlando PHP associative arrays, e voglio utilizzare qualsiasi numero di coppie chiave => Valore stringa, che sarà riconvertito in array associativi dall'altra parte del partito di comunicazione. In alternativa, potrei inviare l'array serializzato, o la rappresentazione JSON come stringa, ma mi piacerebbe sapere come farlo anche in wsdl.

Grazie!

risposta

1

Se si desidera utilizzare un array di stringhe si può solo dichiarare il tipo che ha bisogno l'array:

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

E, a proposito, che cosa si intende con "array associativo"? qualcosa come una mappa C++ o un dizionario python?

2

WSDL non può descrivere la natura associativa di un array associativo. Il meglio che si potrebbe fare sarebbe definire un array di nome/valore.

È possibile definire un servizio PHP con un'operazione che restituisce un array associativo, quindi vedere che cosa produce WSDL? È quindi possibile seguire lo stesso modello nei propri WSDL scritti a mano.

10

per trasferire un array associativo PHP sopra il sapone è necessario definire segue nel vostro 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> 

ora specificare il nuovo tipo definito ArrayOfKeyValueData come il tipo di risultato o come parametro di

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

e specificare l'operazione con someting come

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

Questo funziona bene con un certo tipo di servizio scritto in PHP che restituisce qualcosa come

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

se si utilizza PHP come cliente, si ottiene esattamente lo stesso array sul lato client. altre languges o librerie di saponi possono produrre altre strutture, poiché non tutte le lingue hanno questo tipo di concetto di "array associativo".

+0

È interessante notare che, nonostante la sua definizione di tipo esplicita nel tipo KeyValueData, questo schema trasferisce correttamente anche gli array all'interno degli array, ad esempio array ("k1" => "v1", "k2" => array ("foo" => " bar")). – CodeTwice