什么是用于动态SOAP客户端操作的优秀Java库?

rha*_*ter 6 java client soap wsdl web-services

我一直在寻找Java的SOAP客户端库,并且已经基于构建基于WSDL的存根和代理类的想法找到了大量的库.我有兴趣允许用户在运行时输入WSDL,解析WSDL,然后允许用户在Web服务上执行操作.

有谁知道一个好的SOAP客户端库,它将允许这个运行时使用?或者有没有办法可以使用axis2 wsdl2java功能将存根构建到类加载器中并在运行时使用它们?

Ben*_*ior 3

迟总比没有好。:)

您应该通过两个步骤来实现这一目标:

  • 1) 解析用户通知的 WSDL 以检索可用的操作。请参阅此问题以了解如何以简单的方式执行此操作。

  • 2) 创建动态客户端以使用所选操作发送请求。这可以通过使用Apache CXFDispatch API来完成。

为动态客户端构建Dispatch对象(可以通过通知 Web 服务端点、端口名称等来动态创建):

package com.mycompany.demo;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;

public class Client {
  public static void main(String args[]) {
    QName serviceName = new QName("http://org.apache.cxf", "stockQuoteReporter");
    Service s = Service.create(serviceName);

    QName portName = new QName("http://org.apache.cxf", "stockQuoteReporterPort");
    Dispatch<DOMSource> dispatch = s.createDispatch(portName,
                                                  DOMSource.class,
                                                  Service.Mode.PAYLOAD);
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

构造请求消息(在下面的示例中我们使用DOMSource):

// Creating a DOMSource Object for the request
DocumentBuilder db = DocumentBuilderFactory.newDocumentBuilder();
Document requestDoc = db.newDocument();
Element root = requestDoc.createElementNS("http://org.apache.cxf/stockExample", "getStockPrice");
root.setNodeValue("DOW");
DOMSource request = new DOMSource(requestDoc);
Run Code Online (Sandbox Code Playgroud)

调用网络服务

// Dispatch disp created previously
DOMSource response = dispatch.invoke(request);
Run Code Online (Sandbox Code Playgroud)

建议:

  • ((BindingProvider)dispatch).getRequestContext().put("thread.local.request.context", "true");如果您想让 Dispatch 对象线程安全, 请使用。
  • 缓存该Dispatch对象以供以后使用(如果是这种情况)。构建该对象的过程不是免费的。

其他方法

还有其他方法可以创建动态客户端,例如使用 CXF动态客户端API。您可以在项目的索引页中阅读:

CXF 支持多种替代方案,允许应用程序在没有 SEI 和数据类的情况下与服务进行通信

我自己没有尝试过,但应该值得一试。