2013-02-06 22 views
0

我們有以下情形:PHP皁 - 邏輯,服務器,和其他很多問題

  1. 設置Web服務 - WSDL和所有的,應該是監聽客戶端發送數據,接收它,做一些事情,如果一切正常,則發送回覆爲'OK';如果事件發生,'假'
  2. 客戶端運行腳本,該腳本生成肥皂/ xml請求位,創建肥皂客戶端併發送請求到wsdl。
  3. 客戶端獲取的結果表明數據未由Web服務處理 - 爲false。而Web服務根本沒有收到任何數據。

我沒有訪問Web服務 - 這是別人的。生成的請求正文(整體等)正在生成正確 - 當我通過soapUI發送它的工作,但不是通過我的PHP肥皂客戶端。

我嘗試使用內置的肥皂與SoapClient__doRequest__call(一種嘗試一切的),但沒有任何反應 - 仍然得到'false'結果。我嘗試重寫NuSoap以使用Soap 1.2,但仍然只有'false'的結果返回true。

所以,我想知道是否有人能回答我以下的問題:

  1. 在服務器上,我需要一些專門安裝才能正常使用SOAP 1.2工作?

  2. 當客戶端必須將數據發送到Web服務的函數時,我是否使用__doRequest或__call?或者是其他東西?

  3. 根據我的php.ini服務器的header_accept值沒有使用soap 1.2所需的應用程序/ soap + xml - 這可能是問題,如果是的話 - 回到問題1,或者如何可以我將該類型添加到header_accept?

編輯:

$client = new SoapClient(
    "the_wsdl_url_correct_for_sure.wsdl", 
    array(
     'soap_version' => SOAP_1_2, 
     'trace'  => 1, 
    ) 
); 

$result = $client->__doRequest(
    $the_var_i_use_to_store_the_soap_xml_thingie_that_works_through_soapUI_so_it_is_correct, $location, 
    $the_function_I_try_to_call, 
    "1.2" 
); 

對於$location我的動作(我想打電話,從第一個參數發送數據的功能)的命名空間。而對於動作/功能我試着用行動只是名字,因爲它在命名空間中的已定義,當我試圖使用帶有「full_namespace /動作」

我應該使用__doRequest__call的完整路徑將數據發送到WSDL?

EDIT2:

我發送的請求是:

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <env:Header/> 
    <env:Body> 
     <ns2:FunctionName xmlns:ns2="namespace_of_the_service"> 
     <arg0> 
       <data1>Some data</data1> 
      </arg0> 
     </ns2:FunctionName> 
    </env:Body> 
</env:Envelope> 

更多從這個問題可以在我以前的帖子閱讀: PHP Soap Client - sending the wrong headers "soapenv:VersionMismatch"

+0

可以有很多原因。我可以給出的最佳建議:獲取最新的PHP版本。對於初學者,使用內置的SoapClient類,它支持SOAP 1.2。你很可能提供了錯誤的論點。您是否處於WSDL模式?哪裏是你的代碼(棒SoapClient的一個示例代碼在這裏,如果你問我)? – hakre

+0

不幸的是,我沒有訪問服務器 - 無法自行重新配置它:/而且我確實使用了內置的Soap,但它一直給我提供關於Soap的不匹配版本的錯誤,從中我得出結論:根本不支持1.2 ...或者一路上正在死亡。我將在我的主帖中添加我的soapClient代碼和請求。 – Iv3

+0

如果您收到具體的錯誤消息,請將其添加到您的問題中。還啓用SoapClient類的調試模式,並逐字查看SOAP請求和響應。您可能還想將這兩個添加到您的問題中。 – hakre

回答

0

你問你的問題的方式(s)在這裏不適用於Stackoverflow,我在這裏留下這裏作爲評論,而不是作爲答案,只是爲了向你展示你在獲取這些答案時不會太多提前:

  1. 在服務器上我需要一些特別安裝的東西來使它與Soap 1.2一起工作嗎?

    不,最近一個PHP版本的Soap擴展就足夠了。

  2. 當客戶端必須發送數據到Web服務的功能時,我可以使用__doRequest__call?或者是其他東西?

    這取決於模式(WSDL與否)以及你想要做什麼。 WSDL是什麼,以及WSDL模式是什麼,請read the whole Soap book in the PHP manual from start to end以及我建議,因爲文檔不是完美的,你可以讓自己適應WSDL和第三方WSDL SoapClient示例,這兩個示例都可以通過您的Internet搜索引擎找到選擇。對於__doRequest,請參閱手冊您可以使用它做什麼。對於__call,該手冊清楚地說明了它的用途,並且已過時,因此您可能正在尋找__soapCall

  3. 根據我的php.ini服務器header_accept值沒有一個與SOAP 1.2工作所需的應用程序/肥皂+ XML - 可這是問題,如果是 - 回到問題1,或我如何將這個類型添加到header_accept?

    這可能會根據您的php.ini,我的意思是你可以寫在那裏你想要的東西,然而,根據PHP文件本身沒有header_accept PHP INI指令。請仔細檢查,什麼是寫在php.ini,然後用PHP手冊內該指令的文檔,仔細檢查是否或者如果沒有它控制你喜歡什麼控制 - 或者,如果已經設置 - 它不設置的東西,可能會阻礙你。

    據我知道的一個SoapClient的,你不需要設置任何基於PHP的ini頭接受指令(甚至旁邊的一個實際不存在的!)得到它的工作。它與默認配置一起工作,所以你不需要添加任何東西。

    這讓我想知道你爲什麼要問?什麼讓你覺得你需要添加任何東西(通過你沒有進一步指定)ini設置?

+0

那麼,爲了使用Soap 1.2,發送的頭文件必須是內容類型的application/soap + xml而不是text/xml。我使用getLastRequestHeaders和getLastResponseHeaders,他們都說'content-type text/xml',而在soapUI中,原始數據顯示爲application/soap + xml的內容類型 - 這就是爲什麼我認爲這種類型應該包含在服務器接受的標題。 – Iv3

+0

好的,這可能是一個問題,但是,不要跳到結論哪個php.ini指令可能太快有關。對於您的其他問題,我認爲大部分內容都應該通過PHP手冊進行說明,所以我不清楚爲什麼您問(或者您具體問了什麼)。例如,'__call'(重定向到__soapCall)已經說明了WSDL模式下的作用(或不作用)(通常不用WSDL模式)。 – hakre

+0

最有可能的錯誤是'$ the_var_i_use_to_store_the_soap_xml_thingie_that_works_through_soapUI_so_it_is_isrect錯誤',因爲這個假設可能是完全錯誤的。 PHP soap客戶端不是soapUI,所以您需要在PHP中使用正確的SOAP類型作爲PHP函數參數。不幸的是,你沒有分享具體的內容。此外,您的問題中缺少具體的WSDL URI,以及具體的方法名稱等,這使得這很難遵循。當問一個問題時要精確幷包含所需的信息。 – hakre