2015-04-06 69 views
2

當我運行以下腳本時,我得到一個「class stdClass的對象無法轉換爲SOAP請求的字符串」錯誤$client->LatLonListZipCode($args)行和I無法弄清楚爲什麼。有任何想法嗎?class 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 2015-04-08 14:34:20

+0

@mudasobwa - 我並不假裝是一位SOAP專家,但在我看來,WSDL期望將字符串作爲名爲zipCodeList的參數傳遞給它。如果我做'$ client-> LatLonListZipCode('10001')'它怎麼知道參數名是什麼?無論如何,我嘗試了它,並得到了一個'PHP致命錯誤:未捕獲SoapFault異常:[SOAP-ENV:客戶端]操作''未在此服務的WSDL中定義錯誤 – neubert 2015-04-08 14:37:49

+0

您是否願意嘗試' $ client - > __ soapCall('LatLonListZipCode',array('zipCodeList'=> array('10001')))'['__soapCall'](http://php.net/manual/de/soapclient.soapcall.php)總是爲我工作。 – mudasobwa 2015-04-08 15:04:44

回答

1

異常原因

首先 - 這個服務被使用SOAP 1.1SOAP 1.2。您$client規格更改爲:因爲它是在你的WSDL service specification表示

$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 

服務定義

,你可以找到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'。此外,捕獲異常無疑是最佳實踐,但是在顯示錯誤的環境中快速證明概念是沒有必要的。未捕獲的異常會觸發致命錯誤,並顯示我剛描述的環境。無論如何,你的答案確實起到了作用,所以我會在10小時內向你獎勵賞金(在獎勵之前我必須等待多長時間) – neubert 2015-04-09 04:05:34

+1

我同意你 - 它**是**很愚蠢。你甚至可以在[PHP文檔評論](http://php.net/manual/pl/soapclient.soapcall.php#78707)中找到人們如何克服這一點;) – 2015-04-09 07:22:57

相關問題