Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从SOAP响应获取HTTP状态代码_Java_Http_Soap - Fatal编程技术网

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

Java 从SOAP响应获取HTTP状态代码,java,http,soap,Java,Http,Soap,如何从SOAPConnection.call()的结果中获取HTTP状态?取自 SOAPHTTP遵循的是HTTP状态代码的语义 在HTTP中通信状态信息。例如,2xx状态 代码表示客户端的请求包括SOAP组件 成功接收、理解和接受等 如果在处理请求时出现SOAP错误,SOAP HTTP 服务器必须发出HTTP 500“内部服务器错误”响应,并且 在包含SOAP错误元素的响应中包含SOAP消息 (参见第4.4节)指示SOAP处理错误 来自 SOAPBody对象中包含错误和/或状态的元素 信息。此信

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

取自

SOAPHTTP遵循的是HTTP状态代码的语义 在HTTP中通信状态信息。例如,2xx状态 代码表示客户端的请求包括SOAP组件 成功接收、理解和接受等

如果在处理请求时出现SOAP错误,SOAP HTTP 服务器必须发出HTTP 500“内部服务器错误”响应,并且 在包含SOAP错误元素的响应中包含SOAP消息 (参见第4.4节)指示SOAP处理错误

来自

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

因此,一个可能的答案可能是

SoapMessage soapMessage = null;
soapMessage = MySOAPConnection.call(...);
soapMessage.getSOAPPart().getEnvelope().getBody().getFault().getFaultCode();
帮助我创建此答案的参考资料有:


您可以通过MessageContext接口访问HTTP头

最直接的方法可能是实现一个SOAPHandler,它将允许您访问MessageContext:


但是,SOAP应用程序通常不应该在HTTP状态代码上构建交互,因为这些代码是特定于传输的。

简单的答案是您不能。深入代码,使用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.
任何其他内容都会引发异常,代码将在异常消息字段中的开括号后开始,可能是三位数字,很难精确,因为有人在消息之前忘记了右括号或任何其他分隔符

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

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

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

我确实有类似的要求,如这个问题所述,业务分析师希望记录与每个入站和出站soap调用相关的每个http响应代码。。我的答案适用于ApacheCXF2.7.5

在javax.xml.ws.handler.soap.SoapHandler接口的实现中,您可以通过下面的代码片段通过MessageContext接口访问http状态代码

int status = (( javax.servlet.http.HttpServletResponse)messageContext.get("HTTP.RESPONSE")).getStatus();
另一种选择(java 8):

公共类HttpResponseHandler实现SOAPHandler{
私有记录器log=Logger.create(HttpResponseHandler.class);
@凌驾
公共布尔handleMessage(SOAPMessageContext上下文){
boolean outboundProperty=(boolean)context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);//响应
如果(!outboundProperty){
int status=(int)context.get(MessageContext.HTTP\u RESPONSE\u代码);
log.debug(“HTTP状态代码=”+状态);
}
返回true;
}
}
//用法:构建您的服务
List soapHandlers=new ArrayList();
添加(新的HttpResponseHandler());
URL wsdlDocumentLocation=this.getClass().getResource(“某些URL”);
Service=Service.create(wsdlDocumentLocation,新的QName(“名称空间”,“服务名称”));
service.setHandlerResolver(新的HandlerResolver(){
公共列表getHandlerChain(PortInfo PortInfo){
返回soapHandlers;
}
});
BindingProvider=(BindingProvider)service.getPort(新的QName(“命名空间”、“端口名”),serviceInterface);
provider.getRequestContext().put(“javax.xml.ws.service.endpoint.address”,this.endpointAddress);
provider.getRequestContext().put(“com.sun.xml.ws.connect.timeout”,connectTimeout);
provider.getRequestContext().put(“com.sun.xml.ws.request.timeout”,requestTimeout);
退货供应商;

javax.xml.soap.SOAPConnection类有一个名为“call()”的方法,它返回一个SOAPMesage。SOAPMessage可以有各种响应。例如,一条带有HTTP 200、HTTP 500等的消息。我需要从上述SOAPMessage中找出HTTP代码。我想,您将收到
SOAPException
is
HTTP状态将不同于
200 OK
。是的。但是“soapMessage.getSOAPPart().getEnvelope().getBody().getFault().getFaultCode()”所做的是给出SOAP响应中的故障代码。尽管HTTP头不在SOAP响应本身中。所以使用这种方法无法提取HTTP状态代码,是吗?正确。到2020年,Java 8仍然是这样的:(实际上我不得不从SAAJ重新实现SOAP-HTTP客户端(因为主机名验证器),并且很容易在一些“maybeRC”中进行修补。将迭代器更改为从0开始并添加一个头。添加…例如:key=null(我知道,这可能是错误的,这就是为什么“maybeRC”)