2014-03-13 64 views
1

所以我試圖在PHP中使用SoapClient。當body不爲空時,SoapClient在HTTP 500錯誤上返回空響應

我有一個類適用於大多數我正在使用的服務,但我遇到了問題。

其中一個服務返回帶有HTTP 500錯誤的錯誤,在標題存在正文後。我知道使用SoapUI。但在PHP中,我總是得到一個錯誤和空響應。

下面是從了SoapUI原始形式的響應:

HTTP/1.1 500 Internal Server Error 
Server: nginx/1.4.3 
Date: Thu, 13 Mar 2014 10:17:49 GMT 
Content-Type: multipart/related;start="<rootpart*[email protected]>";type="application/xop+xml";boundary="uuid:e3413bc7-fd66-4420-8d19-c241a5e56173";start-info="text/xml" 
Content-Length: 706 
Connection: keep-alive 

--uuid:e3413bc7-fd66-4420-8d19-c241a5e56173 
Content-Id: <rootpart*[email protected]> 
Content-Type: application/xop+xml;charset=utf-8;type="text/xml" 
Content-Transfer-Encoding: binary 

<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 

<S:Body> 
<S:Fault xmlns:ns3="http://www.w3.org/2003/05/soap-envelope" xmlns=""><faultcode>S:Server</faultcode> 
<faultstring>Validation error</faultstring> 
<detail><ns2:WsException xmlns:ns2="http://api.system.bacca.pl/"> 
<error>Kwota pożyczki netto nie może przekroczyć 5000zł</error> 
</ns2:WsException></detail></S:Fault></S:Body></S:Envelope> 
--uuid:e3413bc7-fd66-4420-8d19-c241a5e56173-- 

我已經擴展SoapClient的,能夠與肥皂singlepart多的消息和在這裏工作的代碼:

class AdvancedSoapClient extends \SoapClient 
{ 

    public function __doRequest($request, $location, $action, $version, $one_way = 0) 
    { 
     $response = parent::__doRequest($request, $location, $action, $version, $one_way); 
     // strip away everything but the xml. 
     //http://www.w3.org/TR/soap12-mtom/#xop-serialization - strip mime multipart in onepart responses 
     $resp = preg_replace('#^.*(<\?xml.*>)[^>]*$#s', '$1', $response); 

     if($resp == null) { 
      $xml = stripos($response, '<?xml'); 

      $resp = substr($response, $xml); 
      $xmlEnd = stripos($resp, 'Envelope>'); 
      $resp = substr($resp,0,$xmlEnd+9); 

      return $resp; 
     } 

     return $resp; 
    } 
} 

我試圖獲得此功能的內容,但當問題發生時$response爲空...

任何想法我能做些什麼來檢索此響應體?

@Edit: 所有我從PHP得到的是的SOAPFault例外:

消息:內部服務器錯誤 代碼:HTTP

@ EDIT2: 獲取完整的原始響應(頭&體)將是有益的足夠太

回答

0

我在這裏分享我對這個問題的解決方案...這不是很好,但它是我最好的解決方法。

如果發生異常我通過cURL在同一個url上運行執行相同xml的類(我已經保存請求錯誤)。具有適當配置的cURL將返回所有數據。然後我得到body並將xml轉換爲我自己的對象。

它不好,最佳或快速...但它的工作...