2013-04-01 231 views
6

如何從SOAPConnection.call()的結果中獲取HTTP狀態?從SOAP響應獲取HTTP狀態碼

+0

javax.xml.soap.SOAPConnection類具有名爲「call()」的此方法並返回一個SOAPMesage。 SOAPMessage可以有各種響應。例如,帶有HTTP 200,HTTP 500等的消息,我需要從SOAPMessage中找出HTTP代碼。 – asthiwanka

+0

我想,你將會收到'SOAPException','http status'將與'200 OK'不同。 – Andremoniy

回答

8

W3C note on SOAP (Section 6.2)

SOAP HTTP兩者遵循HTTP狀態代碼,用於 連通在HTTP狀態信息的語義。例如,2xx狀態 代碼表示客戶端的請求包括SOAP部件 被成功接收,理解和接受等

在SOAP錯誤的情況下在處理請求時,SOAP HTTP 服務器必須發出HTTP 500「內部服務器錯誤」響應和 在包含指示SOAP處理錯誤的SOAP Fault元素 (請參閱第4.4節)的響應中包含SOAP消息。

而且從documentation on SOAPFault in the API

的元素在含有錯誤和/或狀態信息 的 SOAPBody對象。此信息可能與SOAPMessage 對象中的錯誤有關,或者與此消息本身中與內容無關的問題有關。

所以,一個可能的答案可能是

SoapMessage soapMessage = null; 
soapMessage = MySOAPConnection.call(...); 
soapMessage.getSOAPPart().getEnvelope().getBody().getFault().getFaultCode(); 

一些參考這幫助我建立這個答案是:

+1

是的。但是什麼'soapMessage.getSOAPPart()。getEnvelope()。getBody()。getFault()。getFaultCode()'是給出SOAP響應中的錯誤代碼。雖然HTTP標頭不在SOAP響應本身內部。所以使用這種方法不能提取HTTP狀態碼是不是? – asthiwanka

4

簡單的答案是你不能。挖掘到HttpSOAPConnection代碼,HttpURLConnection對象的本地實例用於執行與目標服務的實際通信。這確實得到了httpResponse代碼,但它或多或少地將其從調用者完全隱藏起來。您所得出的結論是,如果您沒有發生異常,但返回的SOAPMessage包含SOAPFault,則返回代碼爲HttpURLConnection.HTTP_INTERNAL_ERROR(即500)。沒有例外,也沒有SOAPFault意味着返回代碼是200到206,所有這些都是「SUCCESS」 - 不幸的是,HttpURLConnection對象中的HTTP頭的狀態條目顯式不會複製到返回的SOAPMessage中的MIMEHeaders中...

// Header field 0 is the status line so we skip it. 

別的會拋出一個異常,在異常的消息字段開括號後的代碼將啓動,可能是三位數,這是很難做到準確,因爲有人忘記關閉支架或任何其他分離器該消息之前...

throw new SOAPExceptionImpl(
        "Bad response: (" 
         + responseCode 
         + httpConnection.getResponseMessage()); 

例如:

com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Bad response: (502internal error - server connection terminated 

這太可怕了一個異常依靠文字信息的格式,b ut響應代碼不會暴露在其他地方。

0

我的確有類似的要求陳述爲這個問題,業務分析師想記錄每個入站和出站肥皂調用相關的每個http響應代碼。我的答案適用於Apache CXF 2.7.5。

在javax.xml.ws.handler.soap.SoapHandler接口的實現中,您可以通過下面的代碼片段通過MessageContext接口訪問http狀態碼。

int status = ((javax.servlet.http.HttpServletResponse)messageContext.get("HTTP.RESPONSE")).getStatus();