soapclient nusoap_client ejemplo php soap types

nusoap_client - soapclient php ejemplo



Pasar tipos definidos por el usuario en PHP SOAP (1)

Tengo problemas para entender cómo pasar tipos definidos por el usuario en llamadas PHP SOAP. ¿Podría alguien darme una pista (o un enlace a un manual) por favor?

Ejemplo: en mi archivo WSDL, defino el tipo:

<types> <schema targetNamespace="http://example.com/CustData" xmlns="http://www.w3.org/2000/10/XMLSchema"> <element name="personalInformation"> <complexType> <all> <element name="name" type="xsd:string"/> <element name="title" type="xsd:string"/> <element name="lang" type="xsd:string"/> </all> </complexType> </element> </schema>

Defino el mensaje de respuesta de servicio como este:

<message name=''getCustDataResponse''> <part name=''Result'' type=''xsd:personalInformation''/> <part name=''Result1'' type=''xsd:string''/> </message>

La parte que falta es: ¿cómo puedo inicializar la respuesta en el lado del servidor SOAP?

Intenté escribir:

$arrRes[''Result''][''name''] = ''xxx''; $arrRes[''Result''][''title''] = ''yyy''; $arrRes[''Result''][''lang''] = ''zzz''; $arrRes[''Result''][''hehehehe1''] = ''test1''; $arrRes[''Result''][''hehehehe2''] = ''test2''; $arrRes[''Result''][''hehehehe3''] = ''test3''; $arrRes[''Result''][''hehehehe4''] = ''test4''; $arrRes[''Result1''] = ''result1''; $arrRes[''blablabla''] = ''hahaha''; return $arrRes;

El cliente recupera la respuesta y cuando yo la var_dump, muestra las arrRes:

array(2) { ["Result"]=> array(7) { ["name"]=> string(3) "xxx" ["title"]=> string(3) "yyy" ["lang"]=> string(3) "zzz" ["hehehehe1"]=> string(5) "test1" ["hehehehe2"]=> string(5) "test2" ["hehehehe3"]=> string(5) "test3" ["hehehehe4"]=> string(5) "test4" } ["Result1"]=> string(7) "result1" }

Esperaba obtener un error porque la matriz que inicié no coincide con el mensaje de respuesta que he definido.

Así que supongo que el tipo que he definido en el wsdl no se usa en absoluto, por lo que debe ser un error en el wsdl o en el código del cliente o del servidor.

Gracias de antemano por su consejo!

Nikola


No he hecho mucho con el servidor de SOAP en php, pero aquí hay un ejemplo de cómo usar el mapeo de clases con SoapClient de php. Estoy bastante seguro de que SoapServer funciona de la misma manera. (Probablemente podría incluso compartir el mismo mapa de clase entre servidor / cliente).

Entonces tendrías una clase como esta:

class PersonalInformation { public $name; public $title: public $lang; }

Entonces para tu respuesta:

function getCustData() { $response = new PersonalInformation; $response->name = "Me"; $response->title = "Hi World"; $response->lang = "En-US"; $arrResult = array(); $arrResult[''Result''] = $response; $arrResult[''Result1''] = ''lol''; return $arrResult }

Entonces solo usa un mapa de clase como:

$server = new SoapServer(''foo?wsdl'', classmap=array(''personalInformation'' => ''PersonalInformation'')); //I''m not sure whether you have to use the classmap on BOTH server/client $client = new SoapClient(''foo?wsdl'', classmap=array(''personalInformation'' => ''PersonalInformation''));

En cuanto a los errores en los datos de respuesta no conformes, no creo que php realmente valide la respuesta, solo la solicitud.