2017-05-05 110 views
1

我使用PHP SoapClient的使用他們的WSDL將請求發送到第三方。當我發送包含所有必需數據的請求時,我有工作功能。但是,如果缺少一個必填字段(或其他一些小錯誤),我在catch中獲得的所有內容都是帶有消息「內部服務器錯誤」的SoapFault。爲了說清楚,我對請求的服務器端進行了零控制。PHP SoapClient的返回null時,服務器會返回一個錯誤響應

使用了SoapUI具有相同的請求,我得到如下回應。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
     <s:Fault> 
     <faultcode>s:Client</faultcode> 
     <faultstring xml:lang="en-US">Request validation failed.</faultstring> 
     <detail> 
      <RequestValidationFault xmlns="http://schemas.datacontract.org/2004/07/OCCM.Phoenix.EWF.Shared.Modules.ERM.Common.BusinessEntities.Exceptions" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
       <Domain>Request validation</Domain> 
       <Message>Request validation failed.</Message> 
       <ValidationResult xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
        <a:string>Patient: Last name is required.</a:string> 
       </ValidationResult> 
      </RequestValidationFault> 
     </detail> 
     </s:Fault> 
    </s:Body> 
</s:Envelope> 

這正是我需要能夠告訴我的系統用戶進入並輸入/修復所需的數據。在這種情況下,患者的姓氏。

我有例外和跟蹤開啓,當一個成功的請求時,我可以使用$ OBJ - > __ getLastResponse()獲得並看到預期的數據。然而,當錯誤返回時,如果我var_dump()它的響應是''或'NULL'。

展望了SoapUI接近我可以看到他們的反應頭:

狀態HTTP/1.1 500內部服務器錯誤

我的假設是,SoapClient的是看到這一點,只是立即拋出基於異常http錯誤。有沒有人有類似的經歷這樣的問題?如果是這樣,有沒有辦法告訴SoapClient返回完整的響應?

如果這是不可能的,沒有人知道,如果有我可以覆蓋保存原始響應文本拋出異常之前的功能?我之前有一個問題,那就是成功的XML響應被包裝在元數據中。通過重寫__doRequest()並手動清除元數據,我得到SoapClient來停止拋出異常。這對我當前的問題不起作用,因爲響應在那裏也是空白的。

回答

0

我無法找到和SoapClient使用的解決方案。出現錯誤時,我最終使用curl重新發送請求。然後我手動解析實際的響應。