Вызов PHP Soap, отличный от WSDL:как вы передаете параметры?
-
06-09-2019 - |
Вопрос
Я пытаюсь выполнить вызов, отличный от 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')
);
Спасибо за любые предложения
-Дэйв
Решение 2
Спасибо.Вот полный пример, который теперь работает:
$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')
);
Другие советы
Решение @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')
);
Надеюсь, это кому-нибудь поможет.
Проблема кроется где-то в отсутствии информации о пространстве имен в параметре.Я использовал первый пример из вашего примера, поскольку он был наиболее близок к тому, что я придумал.
Если вы измените строку:
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')
);
Я не могу это проверить, но ты мог бы.