PHP Soap chamada não-WSDL: como você passar parâmetros?
-
06-09-2019 - |
Pergunta
Eu estou tentando fazer uma chamada não-WSDL em PHP (5.2.5) como este. Tenho certeza de que estou perdendo algo simples. Esta chamada tem um parâmetro, uma corda, chamado de "fuso horário":
$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')
);
Obrigado por todas as sugestões
-Dave
Solução 2
Graças. Aqui está o exemplo completo, que agora 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')
);
Outras dicas
A solução de @ Dave C não funcionou para mim. Olhando em volta eu vim com uma outra solução:
$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 isso pode ajudar alguém.
O algum lugar mentiras problema na falta de informação namespace no parâmetro. Eu usei o primeiro caso de seu exemplo, uma vez que era o mais próximo ao que eu vim acima com.
Se você alterar a linha:
array(new SoapParam('ZULU', 'timezone')),
para:
array(new SoapParam('ZULU', 'ns1:timezone')),
deve dar-lhe o resultado que você espera.
Você poderia tentar adicionar outra chamada array()
em torno de seus parâmetros como este:
$params = array('timezone'=>'ZULU' );
$return = $client->__soapCall("getTimeZoneTime",
array($params),
array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime')
);
Eu não posso testar isso, mas você podia.