gpt4 book ai didi

java - 使用现有的 http 客户端进行 SOAP 调用

转载 作者:行者123 更新时间:2023-12-02 09:16:06 24 4
gpt4 key购买 nike

我有一个工作 Dropwizard项目,它有多种获取所需数据的方法。其中一种方法是 Dropwizard 提供的 JAX-RS 客户端,JerseyClient 。该客户端已配置为适合我的需求(使用正确的代理、超时等...)

现在我的项目有一个新需求,我需要执行 SOAP 调用。我使用以下代码可以正常工作:

// not the actual structure, edited to make a minimal example
// SERVICE_QNAME and PORT_QNAME are hardcoded strings, config.url comes
// from the configuration
import javax.xml.ws.*;
import javax.xml.ws.soap.*;
import javax.xml.namespace.QName;

Service service = Service.create(SERVICE_QNAME);
service.addPort(PORT_QNAME, SOAPBinding.SOAP11HTTP_BINDING, config.url);
Dispatch dispatch = service.createDispatch(PORT_QNAME, SOAPMessage.class, Service.Mode.MESSAGE);
dispatch.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, config.url);


Message message = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL).createMessage();
// do stuff to fill the message
response = dispatch.invoke(message);

这都是开箱即用的行为,这里发生的任何事情都是由 java (8) 或 Dropwizard 提供的。

但是,此代码使用它自己的 http 连接器,绕过我在 JAX-RS 客户端中设置的任何内容。我想以非复制粘贴的方式在 JAX-WS 客户端中重用 JerseyClient 的 http 功能。

有没有办法可以设置 Dispatch,以便它使用现有的 http 连接器?或者其他一些 SOAP 客户端可以实现相同的功能?

最佳答案

感谢@zloster 的研究和建议。然而我决定走另一条路。

我找到了 SAAJ 标准并且现在正在使用它。我为 javax.xml.soap.SOAPConnection 创建了一个子类,并基于 com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection。这部分并不是那么难,给我留下了一个相对较小的类(class)。

现在,在我的代码中,我将上面的代码替换为以下代码:

SOAPConnection soapConnection = new JerseySOAPConnection(httpClient, soapProtocol);
Message message = MessageFactory.newInstance(soapProtocol).createMessage();
// do stuff to fill the message
response = soapConnection.call(message, config.url);

由于我的实现并不那么便携,但我真的不需要它。再次感谢那些帮助我实现这一目标的人!

关于java - 使用现有的 http 客户端进行 SOAP 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58975770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com