2009-08-25 11 views
5

Estoy intentando usar un servicio web para buscar usuarios específicos desde mi aplicación PHP. He utilizado exactamente el mismo servicio web en ASP.NET con éxito.El cliente PHP 5 SOAP devuelve NULL cuando se llama a la función proporcionada por WSDL

Básicamente, hago todo lo que me dice el documento PHP, y utilizo los mismos métodos/variables que utilicé en ASP.NET (para el servicio web en sí), pero parece que no puedo obtener un resultado.

La función aparece en __getFunctions() y debe volver anyType, que si he entendido bien es el equivalente de mixed en PHP:

array(1) { [0]=> string(63) "anyType basicSearch(string $sharedSecret, string $searchParams)" } 

Cuando yo llamo basicSearch() sin embargo, parece devuelve NULL .

basicSearch() debe devolver un documento XML con la información. En ASP.NET solía simplemente lanzar la respuesta a, creo, y a XmlDocument. ¿Debo hacer eso en PHP también? ¿Con qué representación de un documento XML (SimpleXML, DOM, etc.)?

¿Podría mostrarse como NULL simplemente porque PHP no puede entender el formato?

¿Estoy haciendo algo mal en PHP? ¿O debería buscar en el servicio web e intentar depurar de ese lado?

<?php 
    $client = new SoapClient($wsdl_url); 

    echo $client->__getFunctions(); 
    echo "<br />\n"; 
    echo $client->basicSearch($key, $req); 
?> 

PD: Estoy usando la biblioteca de PHP 5. Tal vez usar alguna otra biblioteca como nu-soap sería útil? Parece que hay más documentos en línea al respecto.


Actualización:

Uso de una matriz para pasar el parámetro no funciona, SOAP espera argumentos separados. Llamar a __getLastRequest() devuelve una cadena que concatena la tecla $ y $ req sin ningún otro XML. Llamar a __getLastResponse() devuelve una cadena vacía. No se arroja ninguna excepción. Parece que PHP no sabe qué hacer con los argumentos que le doy, a pesar de que ha analizado el archivo WSDL ya que obtengo la función que uso en la lista cuando llamo a __getFunctions().

Cualquier ayuda sería apreciada.

Actualización ': Todavía no hay solución de trabajo. Estoy desconcertado ...

+0

Tenga en cuenta que haciendo eco de una matriz siempre le dará 'array', porque así es como una matriz se convierte en una cadena. intente usar print_r() o var_dump(). –

+0

Sí, ahora obtengo la función correcta en la lista. Gracias, en realidad lo sabía y lo perdí. Problema actualizado –

+0

Su ejemplo de código no verifica las excepciones que pueda lanzar el cliente. ¿Omitió esto para simplificar el ejemplo? Si no, sugeriría que agregue ese cheque a través de try/catch, ya que podría darle algunos mensajes de error útiles. –

Respuesta

4

Encontré todo esto bastante confuso cuando comencé a usar las bibliotecas de SoapClient en php. La forma correcta de formatear esta materia es la siguiente:

$client = new SoapClient($wsdl_url, array("trace" => 1)); 

$params = array(
    "sharedSecret" => "thisIsSomeSecret", 
    "searchParams" => "thisIsSomeSearchParam" 
); 

$response = $client->basicSearch($params); 

Sin ver la respuesta, yo no puedo decirle cómo hacer referencia a los parámetros de retorno, pero la forma de su almacenado es como un miembro de un objeto var stdClass . Tal que haga referencia a los rendimientos como este ...

$ respuesta-> paramName;

Un buen truco si se mantiene la matriz ("traza" => 1) un conjunto de opciones de allí es que se puede llamar a estas dos funciones ....

$respXML = $client->__getLastResponse(); 
$requXML = $client->__getLastRequest(); 

... para ver la xml real que se envía, para ver si está bien formado. Cuidado, SoapClient tiene muchas fallas. Mucho mejor que nusoap, no vayas por esa basura.

+1

No estoy de acuerdo con la observación de notación/formato: pasa los argumentos como una matriz solo si utiliza el mehtod '$ client -> __ soapCall ($ functionName, $ arguments)', que está destinado principalmente al uso no WSDL. Si usa WSDL, debe llamar funciones directamente por nombre, pasando los argumentos por separado, como hace el OP. –

+0

Pero acepto usar la opción de rastreo y __getLastRequest() para verificar el valor real devuelto. –

+0

Como mencionó Henrik Opel, el método de matriz no parece funcionar. PHP se queja de que falta un parámetro. Cuando uso trace y __getLastRequest() y __getLastResponse() obtengo una concatenación del primer parámetro y el segundo como mi solicitud y una cadena vacía como respuesta, como si PHP no supiera qué hacer con mi solicitud. Una llamada a __getFunctions() devuelve la función que uso, para que se lea WSDL ... Todo esto es confuso. –

1

yeap

$ = nuevo cliente SoapClient ($ wsdl_url, array ("traza" => 1));

parámetro "huella" ayuda

Cuestiones relacionadas