我一直在寻找Java的SOAP客户端库,并且基于构建基于WSDL的存根和代理类的想法找到了大量的库。我有兴趣允许用户在运行时输入WSDL,解析WSDL,然后允许用户在Web服务上执行操作。
有没有人知道一个允许这个运行时使用的好的SOAP客户端库?或者有没有办法可以使用axis2 wsdl2java功能将存根构建到类加载器中并在运行时使用它们?
答案 0 :(得分:3)
晚于永远。 :)
你应该分两步完成:
1)解析用户通知的WSDL以检索可用的操作。请参阅this question以了解如何以简单的方式执行此操作。
2)创建动态客户端以使用所选操作发送请求。可以使用Dispatch中的Apache CXF 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);
...
}
}
构造请求消息(在下面的示例中,我们使用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);
调用网络服务
// Dispatch disp created previously
DOMSource response = dispatch.invoke(request);
建议:
((BindingProvider)dispatch).getRequestContext().put("thread.local.request.context", "true");
。 Dispatch
对象以供使用。构建对象的过程不是免费的。其他方法
还有其他创建动态客户端的方法,例如使用CXF dynamic-clients API。您可以在项目的索引页面中阅读:
CXF支持多种允许应用程序的替代方案 与没有SEI和数据类的服务进行通信
我自己没有尝试过,但值得尝试一下。