rha*_*ter 6 java client soap wsdl web-services
我一直在寻找Java的SOAP客户端库,并且已经基于构建基于WSDL的存根和代理类的想法找到了大量的库.我有兴趣允许用户在运行时输入WSDL,解析WSDL,然后允许用户在Web服务上执行操作.
有谁知道一个好的SOAP客户端库,它将允许这个运行时使用?或者有没有办法可以使用axis2 wsdl2java功能将存根构建到类加载器中并在运行时使用它们?
迟总比没有好。:)
您应该通过两个步骤来实现这一目标:
1) 解析用户通知的 WSDL 以检索可用的操作。请参阅此问题以了解如何以简单的方式执行此操作。
2) 创建动态客户端以使用所选操作发送请求。这可以通过使用Apache CXF的Dispatch 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 和数据类的情况下与服务进行通信
我自己没有尝试过,但应该值得一试。
| 归档时间: |
|
| 查看次数: |
4485 次 |
| 最近记录: |