java客户端动态调用webservice服务

àì夳堔傛蜴生んèń 2022-07-16 02:10 352阅读 0赞
  1. 之前调用webservice服务一直用jdk或者eclipse快速生成客户端代码,这种方式实现起来也比较容易,据说这种方法执行效率也是最好的(动态调用也会动态生成客户端代码)。但是我最近在项目发现这种方式存在一个严重的弊端,那就是当服务端有修改或变动,客户端代码都得重新生成。特别是别人提供的服务端有生产环境和测试环境切换,导致客户端本地代码就得重新生成。所以我就寻思不用生成客户端代码,通过地址动态调用。

动态调用方式如下(其中两种):还有其他好用的方式,欢迎提供,在此谢过

一、CXF提供的方式:

1.依赖的jar:

  1. cxf-2.5.4.jar,
  2. xmlschema-core-2.0.2.jar
  3. neethi-3.0.2.jar,wsdl4j-1.6.2.jar,
  4. commons-logging-1.1.1.jar
  1. 代码参考如下:

    import javax.xml.namespace.QName;
    import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

    public static void sendXmlByCXFWebService(){
    //注意:这种方式调用自己的发布的webservice没问题,
    //但是访问http://ws.webxml.com.cn/上提供服务就报错,暂时没有找到解决方法,如果有哪位知道求指教,不甚感激!
    //服务地址
    String bipEndpoint = “http://127.0.0.1:8888/test?wsdl“;
    JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
    org.apache.cxf.endpoint.Client client = dcf.createClient(bipEndpoint);
    Object[] objects;
    String result = “”;
    try {

    1. //命名空间:http://lfieng.com/ ,getName:方法,1829571****:方法的入参
    2. objects = client.invoke(new QName("http://lfieng.com/", "getName"), "1829571****");
    3. result = objects[0].toString();// 远程调用
    4. // 输出调用结果
    5. System.out.println("接口服务返回数据:\n" + result);

    } catch (Exception e) {

    1. e.printStackTrace();

    }
    }

二、axis提供的方式:

1.依赖的jar:

axis.jar,

jaxrpc.jar,

commons-discovery-0.2.jar,

commons-logging-1.1.1.jar,

wsdl4j-1.6.2.jar

2.代码参考如下:

  1. import javax.xml.namespace.QName;
  2. import org.apache.axis.client.Call;
  3. import org.apache.axis.client.Service;
  4. import org.apache.axis.encoding.XMLType;
  5. public static void sendXmlByAxisWebService() throws Exception{
  6. //服务地址
  7. String requestUrl = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";
  8. String requestXml = "182957****";
  9. Object[] object = new Object[] { requestXml };//请求参数
  10. Service service = new Service();
  11. Call call = (Call) service.createCall();
  12. call.setTargetEndpointAddress(requestUrl);// 远程调用路径
  13. // 调用的命名空间和方法名
  14. call.setOperationName(new QName("http://WebXml.com.cn/", "getMobileCodeInfo"));
  15. call.setUseSOAPAction(true);
  16. //可以在wsdl中找个这个地址
  17. call.setSOAPActionURI("http://WebXml.com.cn/getMobileCodeInfo");
  18. //命名空间和参数名,参数名不可以随便写,参数名可以在wsdl文件中找到
  19. call.addParameter(new QName("http://WebXml.com.cn/","mobileCode"),
  20. org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
  21. call.setReturnType(XMLType.XSD_STRING);// 返回值类型:String
  22. call.setTimeout(100000);//超时
  23. String result = (String) call.invoke(object);// 远程调用
  24. System.out.println(result);
  25. }



发表评论

表情:
评论列表 (有 0 条评论,352人围观)

还没有评论,来说两句吧...

相关阅读