Axis2触发AxisFault异常时,如何获取实际HTTP响应与无效XML消息?
问题:Axis2捕获AxisFault时能否获取服务端返回的实际HTTP响应?
使用Axis2调用WebService时,偶尔会收到无效XML响应,其中一个原因可能是服务端返回HTTP 500错误,进而产生非XML格式的响应。为更高效调试,我们希望记录该HTTP响应内容。请问捕获AxisFault异常时,是否可获取实际HTTP响应?
代码示例:
[...] ServiceClient sender; OperationClient mepClient; sender = new ServiceClient ( axisConfiguration, wsdlLocation, new QName ( ns.getNamespaceURI(), serviceName ), null ); mepClient = sender.createClient ( new QName ( ns.getNamespaceURI(), action ) ); MessageContext messageContext = createMessageContext(method, attachments); mepClient.addMessageContext (messageContext); try { mepClient.execute(true); } catch (AxisFault fault) { // 对方因某些原因返回了非XML内容 - 如何获取实际响应? }
解答
可以获取。AxisFault异常中携带了对应的MessageContext,通过它可以提取出服务端返回的原始HTTP响应内容,具体实现如下:
在catch代码块中添加以下逻辑:
catch (AxisFault fault) { // 获取错误对应的MessageContext MessageContext faultContext = fault.getFaultMessageContext(); if (faultContext != null) { // 获取HTTP响应状态码 Integer statusCode = (Integer) faultContext.getProperty(HTTPConstants.HTTP_SC); if (statusCode != null) { // 记录状态码 System.out.println("HTTP状态码:" + statusCode); } // 获取并读取HTTP响应内容 InputStream responseStream = (InputStream) faultContext.getProperty(HTTPConstants.HTTP_RESPONSE_STREAM); if (responseStream != null) { try { // 读取流内容(这里使用Apache Commons IO的IOUtils,也可以自行实现流读取) String responseContent = IOUtils.toString(responseStream, StandardCharsets.UTF_8); System.out.println("服务端原始响应内容:\n" + responseContent); } catch (IOException e) { e.printStackTrace(); } } } }
注意事项
- 需要导入相关类:
org.apache.axis2.context.MessageContext、org.apache.axis2.transport.http.HTTPConstants,以及org.apache.commons.io.IOUtils(若使用该工具类)。 - 如果
HTTP_RESPONSE_STREAM已被读取过,可尝试从HTTPConstants.RESPONSE_BODY属性中直接获取响应体字符串。 - 该方式适用于服务端返回非XML格式响应的场景,能直接拿到原始的HTTP响应内容,便于定位调试问题。
内容的提问来源于stack exchange,提问作者null8l5
相关产品推荐
相关产品推荐

