2013-04-01 193 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();