2011-07-21 93 views
4

我會開始說我不知道​​我試圖做什麼。我的PHP技能是-beginner,而我對webservices的使用經驗是NULL。從PHP中的WSDL webservice檢索數據

我有一個WSDL URL http://example.com/ws/3.1/NNE?WSDL。我想從PHP腳本中調用searchTargetGroup方法,這樣我就可以遍歷答案並將數據保存到我的數據庫。

Anywho,我不知道如何創建來自PHP的調用。 :-( 我看了NuSOAP的PHP和內置的SoapClient,但沒有運氣。我認爲問題是,我試圖調用一個複雜的方法,但沒有完全理解什麼青蛙我搞亂周圍。

所以我用了SoapUI檢索定義文件並創建一個請求,這完美的作品,我讓所有我想要的信息。問題是,我有不知道我應該怎麼做一個PHP文件創建與SoapUI完全相同的請求(從而得到正確答案)

XML請求SoapUI爲我生成的代碼如下所示:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:nne="http://example.com/ws/NNE"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <nne:searchTargetGroup soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
      <QuestionTargetGroup_1 xsi:type="nne:QuestionTargetGroup" xmlns:nne="http://example.com/ws/NNE"> 
       <companyFormCodeList xsi:type="xsd:string">10,60,80</companyFormCodeList> 
       <companyStatus xsi:type="xsd:string">0</companyStatus> 
       <hasPhoneOnly xsi:type="xsd:boolean">true</hasPhoneOnly> 
      </QuestionTargetGroup_1> 
      <int_2 xsi:type="xsd:int">500</int_2> 
      <int_3 xsi:type="xsd:int">1</int_3> 
      <int_4 xsi:type="xsd:int">1</int_4> 
      <String_5 xsi:type="xsd:string">passstring</String_5> 
     </nne:searchTargetGroup> 
    </soapenv:Body> 
</soapenv:Envelope> 

任何人都可以在某個方向幫助我嗎?最好是正確的。 :-)

我知道你不能測試的URL,因爲它的IP保護,但我真的只想知道如何從PHP文件/函數進行上述調用。

回答

3

首先我自己是初學者,所以我不能保證一個完全正確的答案,但我可以給你至少一些提示。

使用SoapClient而不是NuSoap。 SoapClient是用PHP編寫的C,NuSoap,所以SoapClient更快。

如果您的WSDL文件是好的,那麼所有你需要做的應該是:

$client = new SoapClient("[URL to wsdl]"); 

之後SoapClient的會照顧休息,使得直接使用WSDL中定義的所有過程。

$result = $client->name_of_procedure($arg1, $arg2, ...); 

結果將是類型爲stdClass的類型或具有stdClass類型的元素的數組。

如果沒有WSDL,您必須自己指定所有細節,參數類型,命名空間......並通過__soapCall()直接調用。

無論哪種方式,您可以檢查的$的結構導致的var_dump()&有限公司

+0

其實我試過這個較早,但它返回一個致命的錯誤:「未捕獲的SOAPFault異常:[客戶] SOAP的錯誤:編碼:對象不是招」 t'區「財產」。 WSDL服務的所有者告訴我,我應該忽略我沒有問過的字段,例如「區域」字段。我只是嘗試了調用中定義的所有字段,對於那些我不想問的人來說只是空的,現在它可以工作。一雙清新的眼睛正是我所需要的。謝謝Raffael :) – kasperwf

0

由於拉斐爾說你會更好地利用PHP SOAP擴展提供SoapClient的。

測試您的服務:

首先聲明一個選項數組,其中你可以告訴例如不CHACE的WSDL(它在開發環境中很有用)

$options = array(
       'soap_version'=>SOAP_1_1, 
       'exceptions'=>true, 
       'trace'=>1, 
       'cache_wsdl'=>WSDL_CACHE_NONE 
      ); 

然後建立從啓動客戶端wsdl你有:

$client = new SoapClient("http://service.nnerhverv.dk/nne-ws/3.1/NNE?WSDL", $options); 

像這樣調用searchTargetGroup方法。這裏的關鍵是恩建立正確的questionTargetGroup PARAM,這應該工作:

//build the parameters for the SearchTargetGroup 
$questionTargetGroup = array (
    "companyFormCodeList" => "10,60,80", 
    "companyStatus" => "0", 
    "hasPhoneOnly" => "true" 
); 

$response = $client->searchTargetGroup($questionTargetGroup, 500, 1, 1, "passstring"); 

最後打印你從

print_r($response);