在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动态调用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);
如您所见,这确实很简单。