2013-01-16 102 views
6

我正在使用PHP與SOAP在web服務進行通信。這裏是我的代碼:PHP SoapClient格式錯誤xml

$data = array('name' => 'test', 'age' => 20); 
$WDSL = 'http://xxx.xxxxx.xxx/wdsl.ibs?wsdl'; 
$SOAP = new SoapClient($WDSL, array('trace' => true)); 
$RESULT = $SOAP->__soapCall('Some_Service', $data); 

出於某種原因,XML是錯誤的:

<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Some_Crap"><SOAP-ENV:Body><ns1:Some_Service/><param1>test</param1><param2>20</param2> ... 

爲什麼XML節點名稱是paramX當它應該是變量的名字嗎?我究竟做錯了什麼 ??

感謝

更新: 所以我從web服務中列出的功能,我得到的是:

Some_Service_Response Some_Service(Some_Service $parameters)) 

我改變了我的電話,因此現在是:

$SOAP->__call('Some_Service', array('Some_Service', $data)); 

而XML仍然是錯誤的:

<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV=" 
http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ns1="urn:iwaysoftware:ibse:jul2003:HR_Master"><SOAP-ENV:Body><ns1:Some_Service/> 
<param1><item><key>SomeKey</key><value>SomeValue</value> .... 

我還是得到了<param1><item><key>SomeKey</key><value>SomeValue</value> instead of <Somekey>SomeValue</Somekey>

所以問題是,Web服務不能正常工作,還是在我的最後?

回答

4

如果我是你,我會嘗試以對象格式設置$數據。

$data = array('name' => 'test', 'age' => 20); 

例如:

$data = null; 
$data->name = "test"; 
$data->age = 20; 

$RESULT = $SOAP->__soapCall('Some_Service', $data); 
+0

已經是這種情況了 – Eric

+0

@Eric問題'$ data'是一個數組,而不是一個對象。 –

+0

哦對不起,對,你是對的:) – Eric

7

SoapClient類根據服務的WSDL進行許多校正,例如,刪除無效標籤。檢查WSDL,它可能包含參數的名稱是param1param2

調用SoapClient::__getFunctions()SoapClient::__getTypes()並轉儲結果給出了一個相當不錯的總結,PHP可以從您的WSDL中理解。


(在OP更新了的SoapClient::__getFunctions()的輸出的問題之後是:

Some_Service_Response Some_Service(Some_Service $parameters)) 

一般陣列鍵爲參數名稱,而不是類型。所以我的第一個猜測是:

$SOAP->__call('Some_Service', array('parameters', $data)); 

雖然這個問題可能在服務器端。 WSDL不兼容性有時需要手動調整WSDL文件,以便PHP發出所需的相同XML。

但是在做任何黑客入侵之前(如果有機會的話)請務必嘗試不使用PHP的服務來查看服務對不同XML文件的反應。一個名爲SoapUI的好程序可以爲你做這件事,它會自動生成XML存根來測試。 (我只在使用需要數字簽名的Web服務的SoapUI時遇到問題。)

基於XML的結果的測試,你可能需要:

  • 手調WSDL
  • 手動生成XML文件併發送到Web服務器(不得已)
  • 如果XML幾乎是正確的,那麼它只需要一個小的微調,您也可以從SoapClient類中派生出來,並覆蓋SoapClient::__doRequest方法,以便在提交給服務器之前對XML文件執行字符串操作(通過調用基地的__dorequest類)。舉個例子,當我使用這個解決方案時,Web服務需要在某些標籤上重新發送一些XML屬性。
+0

不,這裏是WSDL沒有這樣的事情.. – Eric

+0

這是我得到:陣列([0] =>結構ibsinfo {弦業務;串方法;字符串許可;字符串處置;字符串用戶名;字符串密碼;字符串語言;} [1] =>結構適配器{字符串錯誤;} [2] =>結構Some_Service {Some_Service_ComplexType hr_master;} [3] =>結構Some_Service_ComplexType { WS_Transaction_ID WS_Transaction_ID; Web_Service_Request_Type ... – Eric

+1

請把它放在問題b中(一)它屬於那裏(二)評論不能有新線,以提高可讀性(三)評論有限長度和有趣的部分丟失 – Csq