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

如何提取打印出的SOAP XML响应并存储到变量中

从JAX-WS HTTP Dump输出中提取XML内容

我来帮你解决这个问题,从JAX-WS的HTTP dump输出里提取XML其实有两种常用的方式:一种是直接解析你已经拿到的控制台输出字符串,适合临时调试;另一种是用JAX-WS自带的Handler机制拦截消息,这种方式更可靠,适合正式代码场景。咱们一步步看:

方式一:解析控制台Dump字符串

你已经通过系统属性开启了HTTP dump,输出内容分为HTTP响应头和SOAP XML体两部分,XML内容从<?xml version='1.0' encoding='utf-8'?>开始,到</soapenv:Envelope>结束。你可以通过字符串截取的方式提取这部分内容:

// 假设dumpOutput是包含完整打印内容的字符串
String dumpOutput = "---[HTTP response - https://XXXXXXXXXXXXXXXXX/v1.0?wsdl - 200]---\nnull: HTTP/1.1 200 OK\nConnection: Keep-Alive\n...(你的完整dump内容)";

// 定义XML的起始和结束标记
String xmlStartMarker = "<?xml version='1.0' encoding='utf-8'?>";
String xmlEndMarker = "</soapenv:Envelope>";

// 查找标记的索引位置
int startIndex = dumpOutput.indexOf(xmlStartMarker);
int endIndex = dumpOutput.indexOf(xmlEndMarker) + xmlEndMarker.length();

// 提取并验证XML内容
if (startIndex != -1 && endIndex != -1) {
    String extractedXml = dumpOutput.substring(startIndex, endIndex);
    // extractedXml就是你需要的XML内容,可存储到变量供后续使用
    System.out.println("提取到的XML内容:\n" + extractedXml);
} else {
    System.err.println("在dump输出中未找到完整的XML内容,请检查输出格式");
}

方式二:使用JAX-WS Handler拦截消息(推荐)

如果是在正式代码中,直接解析控制台输出不是最优方案,你可以用JAX-WS的SOAPHandler来直接拦截响应消息,这样能更可靠地获取XML内容,无需依赖控制台输出:

1. 实现SOAPHandler类

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
import java.io.ByteArrayOutputStream;
import java.util.Set;

public class SOAPResponseHandler implements SOAPHandler<SOAPMessageContext> {

    // 存储提取到的XML内容(可根据需求调整为类成员变量供外部访问)
    private String responseXml;

    @Override
    public Set<QName> getHeaders() {
        return null;
    }

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        // 判断是否为响应消息(false表示入站,即服务端返回的响应)
        Boolean isOutbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        if (!isOutbound) {
            try {
                SOAPMessage soapMessage = context.getMessage();
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                soapMessage.writeTo(outputStream);
                // 将SOAP消息转换为XML字符串
                responseXml = outputStream.toString("UTF-8");
                // 这里可以直接对responseXml做后续处理,比如解析、存储等
                System.out.println("拦截到的响应XML:\n" + responseXml);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return true; // 继续处理消息链
    }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        return true;
    }

    @Override
    public void close(MessageContext context) {
        // 清理资源(如果需要)
    }

    // 提供外部获取XML的方法
    public String getResponseXml() {
        return responseXml;
    }
}

2. 注册Handler到JAX-WS客户端

在创建JAX-WS客户端端口时,将上面的Handler添加到客户端的处理链中:

// 假设你的JAX-WS客户端服务类是InquiryService,端口类是InquiryPort
InquiryService service = new InquiryService();
InquiryPort port = service.getInquiryPort();

// 获取BindingProvider并添加Handler
BindingProvider bindingProvider = (BindingProvider) port;
SOAPResponseHandler responseHandler = new SOAPResponseHandler();
bindingProvider.getBinding().getHandlerChain().add(responseHandler);

// 调用服务方法
InquiryResponse response = port.yourInquiryMethod(yourRequest);

// 获取提取到的XML内容
String extractedXml = responseHandler.getResponseXml();
// 后续使用extractedXml即可

这种方式不需要依赖控制台dump,直接在代码层面拦截消息,稳定性和可维护性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:27:13