从SOAP响应中获取HTTP状态代码

ast*_*nka 10 java soap http

如何从结果中获取HTTP状态SOAPConnection.call()

PCo*_*der 10

摘自W3C关于SOAP的说明(第6.2节)

SOAP HTTP遵循HTTP状态代码的语义,用于在HTTP中传递状态信息.例如,2xx状态代码表示已成功接收,理解和接受包括SOAP组件的客户端请求等.

如果在处理请求时出现SOAP错误,SOAP HTTP服务器必须发出HTTP 500"内部服务器错误"响应,并在响应中包含一条SOAP消息,其中包含指示SOAP处理错误的SOAP Fault元素(请参阅第4.4节).

并从API中的SOAPFault文档

SOAPBody对象中包含错误和/或状态信息的元素.此信息可能与SOAPMessage对象中的错误或与消息本身中的内容无关的问题有关.

所以,可能的答案是

SoapMessage soapMessage = null;
soapMessage = MySOAPConnection.call(...);
soapMessage.getSOAPPart().getEnvelope().getBody().getFault().getFaultCode();
Run Code Online (Sandbox Code Playgroud)

一些帮助我创建这个答案的参考文献是:


Jer*_*ing 5

简单的答案是你不能。深入了解HttpSOAPConnection代码,使用 HttpURLConnection 对象的本地实例与目标服务进行实际通信。这确实获得了 httpResponse 代码,但它或多或少地完全对调用者隐藏了它。您得出的结论是,如果您没有收到异常但返回的 SOAPMessage 包含 SOAPFault,则返回代码为 HttpURLConnection.HTTP_INTERNAL_ERROR(即 500)。没有例外,没有 SOAPFault 意味着返回代码是 200 到 206,所有这些都是“成功” - 不幸的是,来自 HttpURLConnection 对象中的 HTTP 标头的状态条目没有明确地复制到返回的 SOAPMessage 中的 MIMEHeaders ...

// Header field 0 is the status line so we skip it.
Run Code Online (Sandbox Code Playgroud)

其他任何事情都会引发异常,并且代码将在异常消息字段中的左括号之后开始,并且可能是三位数,很难准确,因为有人忘记了右括号或消息之前的任何其他分隔符......

throw new SOAPExceptionImpl(
                    "Bad response: ("
                        + responseCode
                        + httpConnection.getResponseMessage());
Run Code Online (Sandbox Code Playgroud)

例如:

com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Bad response: (502internal error - server connection terminated
Run Code Online (Sandbox Code Playgroud)

在异常中依赖文本消息的格式是可怕的,但响应代码不会在其他任何地方公开。