Вызов PHP Soap non-WSDL: как вы передаете параметры?

Я пытаюсь сделать вызов не WSDL в PHP (5.2.5) следующим образом. Я уверен, что я пропустил что-то простое. Этот вызов имеет один параметр, строку, называемую «часовой пояс»:

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

Спасибо за любые предложения
-Dave

Related of "Вызов PHP Soap non-WSDL: как вы передаете параметры?"

Решение @Dave C не сработало для меня. Оглядевшись, я придумал другое решение:

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

Надеюсь, это может помочь кому-то.

Благодарю. Вот полный пример, который теперь работает:

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

Проблема заключается где-то в отсутствии информации о пространстве имен в параметре. Я использовал первый пример вашего примера, поскольку он был ближе всего к тому, что я придумал.

Если вы измените строку:

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

чтобы:

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

он должен дать вам результат, которого вы ожидали.

Вы можете попытаться добавить еще один array() вызова своих параметров:

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

Я не могу проверить это, но вы могли бы.