Вызов PHP Soap, отличный от WSDL:как вы передаете параметры?

StackOverflow https://stackoverflow.com/questions/928169

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top