Pregunta

Estoy tratando de hacer una llamada no-WSDL en PHP (5.2.5) como este. Estoy seguro de que me falta algo sencillo. Esta convocatoria tiene un parámetro, una cadena, llamada "zona horaria":

    $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

¿Fue útil?

Solución 2

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')
);

Otros consejos

solución

de @Dave acondicionado no funcionaba para mí. Mirando a su 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 puede ayudar a alguien.

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

Si cambia la línea:

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

a:

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

hay que darle el resultado que se esperaba.

Usted podría intentar añadir otra llamada array() 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 se puede.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top