在
Python中,我可以轻松地使用Web服务:
from suds.client import Client client = Client('http://www.example.org/MyService/wsdl/myservice.wsdl') #create client result = client.service.myWSMethod("Bubi",15) #invoke method print result #print the result returned by the WS method
我想用Java达到这么简单的用法.
使用Axis或CXF,您必须创建一个Web服务客户端,即一个包复制所有Web服务方法的包,以便我们可以像使用普通方法一样调用它们.我们称之为代理类;通常它们是由wsdl2java工具生成的.
实用且用户友好.但是每当我添加/修改Web服务方法并且我想在客户端程序中使用它时,我需要重新生成代理类.
所以我找到了CXF DynamicclientFactory,这种技术避免了使用代理类:
import org.apache.cxf.endpoint.Client; import org.apache.cxf.endpoint.dynamic.DynamicclientFactory; //... //create client DynamicclientFactory dcf = DynamicclientFactory.newInstance(); Client client = dcf.createClient("http://www.example.org/MyService/wsdl/myservice.wsdl"); //invoke method Object[] res = client.invoke("myWSMethod","Bubi"); //print the result System.out.println("Response:\n" + res[0]);
但不幸的是,它创建并编译代理类运行时,因此在生产机器上需要JDK.我必须避免这种情况,或者至少我不能依赖它.
我的问题:
是否有另一种方法可以在Java中以动态方式调用Web服务的任何方法,而无需在运行时使用JDK并且不生成“静态”代理类?也许有一个不同的图书馆?谢谢!
解决方法
我知道这是一个非常古老的问题,但如果你仍然感兴趣,你可以使用soap-ws github项目:
https://github.com/reficio/soap-ws
Wsdl wsdl = Wsdl.parse("http://www.webservicex.net/CurrencyConvertor.asmx?WSDL"); SoapBuilder builder = wsdl.binding() .localPart("CurrencyConvertorSoap") .find(); SoapOperation operation = builder.operation() .soapAction("http://www.webserviceX.NET/ConversionRate") .find(); Request request = builder.buildInputMessage(operation) SoapClient client = SoapClient.builder() .endpointUrl("http://www.webservicex.net/CurrencyConvertor.asmx") .build(); String response = client.post(request);
你可以看到它非常简单.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。