You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
            }
        }
    }
}

注意事项

  1. 需要导入相关类:org.apache.axis2.context.MessageContext、org.apache.axis2.transport.http.HTTPConstants,以及org.apache.commons.io.IOUtils(若使用该工具类)。
  2. 如果HTTP_RESPONSE_STREAM已被读取过,可尝试从HTTPConstants.RESPONSE_BODY属性中直接获取响应体字符串。
  3. 该方式适用于服务端返回非XML格式响应的场景,能直接拿到原始的HTTP响应内容,便于定位调试问题。

内容的提问来源于stack exchange,提问作者null8l5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:15:27