2009-05-29 20 views
7

Estoy tratando de hacer una llamada no WSDL en PHP (5.2.5) de esta manera. Estoy seguro de que me estoy perdiendo algo simple. Esta convocatoria tiene un parámetro, una cadena, llamada "zona horaria":PHP Soap llamada no WSDL: ¿cómo se pasan los parámetros?

$URL = 'http://www.nanonull.com/TimeService/TimeService.asmx'; 

    $client = new SoapClient(null, array(
     'location' => $URL, 
     'uri'  => "http://www.Nanonull.com/TimeService/", 
     'trace' => 1, 
     )); 

// First attempt: 
// FAILS: SoapFault: Object reference not set to an instance of an object 
    $return = $client->__soapCall("getTimeZoneTime", 
     array(new SoapParam('ZULU', 'timezone')), 
     array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime') 
    ); 

// Second attempt: 
// FAILS: Generated soap Request uses "param0" instead of "timezone" 
    $return = $client->__soapCall("getTimeZoneTime", 
     array('timezone'=>'ZULU'), 
     array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime') 
    ); 

Gracias por cualquier sugerencia
-Dave

Respuesta

8

Gracias. Aquí está el ejemplo completo que ahora funciona:

$URL = 'http://www.nanonull.com/TimeService/TimeService.asmx'; 

$client = new SoapClient(null, array(
    'location' => $URL, 
    'uri'  => "http://www.Nanonull.com/TimeService/", 
    'trace' => 1, 
    )); 

$return = $client->__soapCall("getTimeZoneTime", 
    array(new SoapParam('ZULU', 'ns1:timezone')), 
    array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime') 
); 
0

Se podría tratar de añadir otro array() llamada alrededor de los parametros de esta manera:

$params = array('timezone'=>'ZULU'); 
$return = $client->__soapCall("getTimeZoneTime", 
    array($params), 
    array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime') 
); 

No puedo probar esto, pero podría.

+0

Lo intenté, pero pasa toda la matriz como param0. Así que no vayas. –

4

El problema se encuentra en algún lugar en la falta de información de espacio de nombres en el parámetro. Usé el primer caso de tu ejemplo, ya que estaba más cerca de lo que se me ocurrió.

Si cambia la línea:

array(new SoapParam('ZULU', 'timezone')), 

a:

array(new SoapParam('ZULU', 'ns1:timezone')), 

debe darle el resultado que se esperaba.

8

@La solución de Dave C no funcionó para mí. Mirando a mi alrededor, se me ocurrió otra solución:

$URL = 'http://www.nanonull.com/TimeService/TimeService.asmx'; 

$client = new SoapClient(null, array(
    'location' => $URL, 
    'uri'  => "http://www.Nanonull.com/TimeService/", 
    'trace' => 1, 
    )); 

$return = $client->__soapCall("getTimeZoneTime", 
    array(new SoapParam(new SoapVar('ZULU', XSD_DATETIME), 'timezone')), 
    array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime') 
); 

Espero que esto pueda ayudar a alguien.

Cuestiones relacionadas