2009-03-06 22 views
7

¿Cómo puedo definir una matriz asociativa en un archivo SOAP wsdl? Así es como defino un tipo de elemento de matriz hasta ahora:SOAP WSDL matrices asociativas

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

Gracias!


Estoy hablando de PHP associative arrays, y quiero utilizar cualquier número de pares clave => Valor de cadena, que se convierte de nuevo en matrices asociativas en el otro lado de la parte de comunicación. Como alternativa, podría enviar la matriz serializada o la representación json como una cadena, pero también me gustaría saber cómo hacerlo en wsdl.

Gracias!

Respuesta

1

Si desea utilizar una matriz de cadenas es posible que sólo declarar en el tipo que necesita la matriz:

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

Y, por cierto, ¿qué quiere decir con "matriz asociativa"? algo así como un mapa de C++ o un diccionario de Python?

2

WSDL no puede describir la naturaleza asociativa de una matriz asociativa. Lo mejor que podría hacer sería definir una matriz de nombre/valor.

¿Puede definir un servicio de PHP con una operación que devuelva una matriz asociativa, y luego ver qué WSDL produce? Luego podría seguir el mismo patrón en sus propios WSDL escritos a mano.

10

para transferir una matriz asociativa php sobre el jabón tendrá que definir siguiente en su 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> 

Ahora especifique el nuevo tipo de ArrayOfKeyValueData define como el tipo de su resultado o como parámetro

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

y especificar su operación con calle detrás como

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

esto va a funcionar bien con algún tipo de servicio web escrito en PHP que devuelve algo así como

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

si está usando PHP como cliente, usted recibirá exactamente la misma matriz en el lado del cliente. otros languges o bibliotecas de jabón pueden producir otra estructura, ya que no todos los idiomas tienen este tipo de concepto de "matriz asociativa".

+0

Curiosamente, a pesar de su definición de tipo explícita en el tipo KeyValueData, este esquema también transfiere matrices dentro de matrices correctamente, por ejemplo matriz ("k1" => "v1", "k2" => matriz ("foo" => " bar")). – CodeTwice