2010-09-28 75 views
2

我試圖使用SoapClient從PHP代碼調用Web服務。param0在使用SoapClient類的PHP中的Soap請求中消失

$service = new SoapClient($wsdl); 
$service->myFunction('something', 'anotherthing', 'onemore'); 

如果我打開跟蹤,並獲得最後一個請求,我可以看到,第一個參數總是從SOAP消息丟失,即param0是永遠存在。具有更少或更多參數的功能是一樣的。

SOAP請求:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Body> 
    <myFunction /> 
    <param1>anotherthing</param1> 
    <param2>onemore</param2> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

我希望它是(和使用soapUI的時候就是我的網絡服務接受):

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Body> 
    <myFunction> 
     <param0>something</param0> 
     <param1>anotherthing</param1> 
     <param2>onemore</param2> 
    </myFunction> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

這是相同與

__soapCall('myFunction', array($something, $anotherthing, $onemore)); 

我在Windows XP上使用xpppplite。

更新:http://programming.itags.org/php/236781/是有人用同樣的問題(發佈於2008年,沒有答案:()鏈接

更新2:我也注意到,它並沒有把代表參數的XML元素子元素代表函數的元素,這是不對的?!!

我已經做了一個可怕的修復,我重載了__doRequest函數並編輯了$ request變量,它可以工作,但它很糟糕。我不妨自己編譯整個請求......

更新3:對我來說,感覺就像PHP一樣故障。但是如果這是肥皂實施中的一個錯誤,我認爲網上會有更多的信息。 aaaargh。接下來的嘗試是嘗試NuSoap和PEAR。

更新4:爲了取整,我沒有嘗試NuSoap和PEAR。我剛剛與我的'黑客',因爲它的工作,還有其他需要做的活動。此外,演示已經完成,下一階段PHP將不再使用。所以整個事情無論如何都會重新實施。

回答

0

通過擴展doRequest方法和調試$request參數,可以看到SoapClient發送的內容。

或者,SoapClient::__getLastRequest也可以使用,但我在過去當我的呼叫產生一個異常(即:不遵守WDSL)時有一些問題,在doRequest中您可以在發送之前檢查XML。

請確保傳遞參數的工作方式與預期相同,並且您的問題可能在於您要發送的實際變量,或者調用與WSDL中指定的操作不匹配。

+0

我的意思是得到最後一個請求是調用__getLastRequest()。我編輯了我的問題以顯示__getLastRequest()返回的Soap請求。我會看看doRequest()顯示了什麼。 – 2010-09-28 12:53:17

+0

doRequest報告相同。有道理我猜:)。但是,這給了我自己在doRequest超載中添加param0的想法。也許不是最優雅的解決方案,但它適合問題的優點.........如果它有效或無效,我會報告回來。 – 2010-09-28 13:35:56

+0

你有沒有嘗試過不同的操作(或更好的,不同的WSDL)?也許這是特定的操作。您必須確定問題是出在SoapClient還是WSDL上。 – 2010-09-28 14:37:35

2

TL; DR版本:您正在錯誤地調用您的SOAP方法。將參數放入數組中,而不是將它們作爲PHP的__call()的單獨參數。

我有這個相同的問題,它真的把我困住了。我猜我只是把我的頭靠在牆上稍微長一些。我發現我是這樣做的:

$soapclient = new SoapClient($uri); 
$soapclient->MethodName($param0, $param1, $param2); 

這奇怪的是,創建SOAP XML像這樣:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
<SOAP-ENV:Body> 
<MethodName/> 
<param1>$param1</param1> 
<param2>$param2</param2> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

我應該做的是調用的方法,像這樣:

$soapclient = new SoapClient($uri); 
$soapclient->MethodName(array($param0, $param1, $param2)); 

這將創建SOAP XML如下:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
<SOAP-ENV:Body> 
<MethodName> 
<param0>$param0</param0> 
<param1>$param1</param1> 
<param2>$param2</param2> 
</MethodName> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

事後看來,還挺明顯的 - 但我可以看到我是如何將SOAP參數誤認爲是PHP參數的!

+0

感謝您的回覆。這真的可能是問題的原因。我無法再訪問該特定的代碼,因此很難對其進行測試。但是,如果我查看原始文本,則看到我輸入了該調用的錯誤:「__soapCall('myFunction',array($ something,$ anotherthing,$ onemore));」。我在那裏做錯了什麼,在這種情況下你也會得到同樣的錯誤?如果我有時間回家,我會嘗試再次設置並測試它以確保。我會把它放在我的Google待辦事項列表中:)。 – 2011-01-28 09:57:32

+0

我曾試過__soapCall,以及有序和關聯數組。從記憶中它並沒有幫助我 - 雖然現在讓我覺得是的,但你會期望它能奏效。 (不幸的是所有失敗的嘗試都不在SVN中,所以我無法確定,嘿) – KingJackaL 2011-02-02 00:07:03