2015-04-06 2 views
2

Когда я запускаю следующий скрипт, я получаю «Объект класса stdClass не может быть преобразован в строку для запроса SOAP» ошибка на линии $client->LatLonListZipCode($args) и I не может понять, почему. Есть идеи?Объект класса stdClass не может быть преобразован в строку для запроса SOAP

<?php 
$contextOptions = array(
      'ssl' => array(
       'verify_peer' => false, 
       'verify_peer_name' => false, 
       'allow_self_signed' => true 
      ), 
      'http' => array(
       'timeout' => 5 //seconds 
      ) 
); 

//create stream context 
$stream_context = stream_context_create($contextOptions); 

//create client instance (over HTTPS) 
$client = new SoapClient('http://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl', array(
      'cache_wsdl' => WSDL_CACHE_NONE, 
      'exceptions' => 1, 
      'trace' => 1, 
      'stream_context' => $stream_context, 
      'soap_version'=> SOAP_1_2, 
      'connection_timeout' => 5 //seconds 
));//SoapClient 

$args = new stdClass(); 
$args->zipCodeList = '10001'; 

$z = $client->LatLonListZipCode($args); 
+0

'LatLonListZipCode' ожидает строку как параметр, в то время как вы передаете' stdClass'. Нечего добавлять, если вы не поделитесь знаниями о ожидаемом списке параметров «LatLonListZipCode». 'SoapClient' [управляет строковыми экземплярами] (http://php.net/manual/en/class.soapclient.php). – mudasobwa

+0

@mudasobwa - Я не претендую на роль эксперта SOAP, но мне кажется, что WSDL ожидает, что строка будет передана ему как параметр с именем zipCodeList. Если я делаю '$ client-> LatLonListZipCode ('10001')', как он узнает, что такое имя параметра? Тем не менее, я попробовал и получил «PHP Fatal error: Uncaught SoapFault exception: [SOAP-ENV: Client] Операция '' не определена в WSDL для этой ошибки службы – neubert

+0

Не могли бы вы попытаться использовать' $ client -> __ soapCall ('LatLonListZipCode', массив ('zipCodeList' => array ('10001'))) '[' __soapCall'] (http://php.net/manual/de/soapclient.soapcall.php) всегда просто работал для меня. – mudasobwa

ответ

1

Исключение причиной

Прежде всего - это служба использует SOAP 1.1неSOAP 1.2. Измените $client спецификацию:

$client = new SoapClient('http://graphical.weather.gov/xml/DWMLgen/wsdl/ndfdXML.wsdl', array(
      'cache_wsdl' => WSDL_CACHE_NONE, 
      'exceptions' => 1, 
      'trace' => 1, 
      'stream_context' => $stream_context, 
      'soap_version'=> SOAP_1_1,//<-- note change here 
      'connection_timeout' => 5 //seconds 
));//SoapClient 

Service Definition

Как указано в вашем WSDL service specification, вы можете обнаружить, что LatLonListZipCode функция определяется следующим образом:

<operation name="LatLonListZipCode"> 
    <documentation>Returns a list of latitude and longitude pairs with each pair corresponding to an input zip code.</documentation> 
    <input message="tns:LatLonListZipCodeRequest"/> 
    <output message="tns:LatLonListZipCodeResponse"/> 
</operation> 

и ожидаемые параметры определяются как :

<xsd:simpleType name="zipCodeListType"> 
    <xsd:restriction base='xsd:string'> 
     <xsd:pattern value="\d{5}(\-\d{4})?(\d{5}(\-\d{4})?)*" /> 
    </xsd:restriction> 
</xsd:simpleType> 

Правильный вызов

Таким образом, мы знаем, что для этого сервера требуется только один параметр string с именем zipCodeList. Теперь мы можем вычитать, что ваш код должен быть таким:

$args = array("zipCodeList"=>'10001'); 
try { 
$z = $client->LatLonListZipCode($args); 
} catch (SoapFault $e) { 
    echo $e->faultcode; 
} 

Обратите внимание, что я ловлю SoapFault исключение. Это поможет вам понять ошибки на стороне сервера. Узнайте больше об этом в PHP documentation.

+1

Это сработало. Хотя я думаю, что это немного глупо. Похоже, что PHP мог бы автоматически преобразовать StdClass в массив ala '$ args = (array) $ args'. Кроме того, catching Exceptions, безусловно, является лучшей практикой, но в быстром доказательстве концепции в среде, где отображаются ошибки, это необязательно. Невыпущенное исключение вызывает фатальную ошибку и отображается только что описанная среда. Тем не менее, ваш ответ заставил его работать, поэтому я вручу вам награду за 10 часов (вот как долго я должен ждать до его награждения) – neubert

+1

Я согласен с тобой - это ** ИС ** глупо , Вы даже можете найти в [PHP docs comments] (http://php.net/manual/pl/soapclient.soapcall.php#78707), как люди это преодолевают;) –

Смежные вопросы