这两天一直在做外系统对接,对方的接口是webservice的形式,调用起来有些蛋疼,于是在这里记录一下我尝试过的调用WebService的三种方式。

方式一:以HttpURLConnection的方式调用

         String url ="http://127.0.0.1/cwbase/Service/hndg/Hello.asmx?wsdl";URL realURL = new URL(url);HttpURLConnection connection = (HttpURLConnection) realURL.openConnection();connection.setDoOutput(true);connection.setDoInput(true);connection.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");connection.setRequestProperty("content-length",String.valueOf(xmlData.length));connection.setRequestMethod("POST");DataOutputStream printOut = new DataOutputStream(connection.getOutputStream());printOut.write(xmlOutString.getBytes("UTF-8"));//xmlOutString是自己拼接的xml,这种方式就是通过xml请求接口printOut.flush();printOut.close();// 从连接的输入流中取得回执信息InputStream inputStream = connection.getInputStream(); InputStreamReader isr = new InputStreamReader(inputStream,"UTF-8");BufferedReader bufreader = new BufferedReader(isr); String xmlString = ""; int c;while ((c = bufreader.read()) != -1) { xmlString += (char) c; } isr.close();//处理返回的xml信息DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document d = db.parse(new ByteArrayInputStream(xmlString.getBytes("UTF-8")));//从对方的节点中取的返回值(节点名由对方接口指定)String returnState = d.getElementsByTagName("ReturnStatus").item(0).getFirstChild().getNodeValue();

方式二:使用apache-cxf生成java类调用

下载apache-cxf并配置环境变量(参照JAVA环境变量配置),配置成功后cmd输入wsdl2java -help即可验证是否成功。
接着在cmd中输入wsdl2java -encoding utf-8 -d 生成路径 接口地址,即可在指定路径生成接口JAVA文件,生成后的JAVA类如下图:

生成以后调用起来就很简单了,例子如下:

     String result = "";NC65To63ProjectService service = new NC65To63ProjectService();NC65To63ProjectServicePortType servicePort =service.getNC65To63ProjectServiceSOAP11PortHttp(); result = servicePort.receiptProject(json);

方式三:使用AXIS调用WebService

为了避免找不到对方包,所以我直接把包贴在顶上了。

import org.apache.axis.client.Service;
import org.apache.axis.client.Call;
import org.apache.axis.encoding.XMLType;import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;String result = "";String url = "http://127.0.0.1/uapws/service/nc65to63projectsysplugin";//这是接口地址,注意去掉.wsdl,否则会报错Service service = new Service();Call call = (Call) service.createCall();call.setTargetEndpointAddress(url);String parametersName = "string";//设置参数名call.setOperationName("receiptProject");//设置方法名call.addParameter(parametersName, XMLType.XSD_STRING, ParameterMode.IN);//方法参数,1参数名、2参数类型、3.入参call.setReturnType(XMLType.XSD_STRING);//返回类型String str = json;Object resultObject = call.invoke(new Object[] { str });//调用接口result = (String) resultObject;

总结

第一种使用HttpURLConnection调用的方法,基本不用担心什么兼容问题,但是通过xml请求接口,需要自己手动拼接xml(一般通过soapui生成,然后在程序中根据情况拼接),并且返回的数据也是xml,还要通过代码解析,可以说是极其麻烦了。

另外,我在实际使用中,调用一个特殊接口时竟然没有返回正确结果,而是返回了wsdl文档,这一点我折腾了很久也没能找到原因,网上也有同样受到这个问题困扰的人,有知道的可以指点一二。
这是我在某博客下看到的回复:

第二种apache-cxf生成java类调用的方式,直接调用生成的类即可访问接口,非常方便,但是apache-cxf和jdk有兼容问题,如果关联的某个jar包中的代码有冲突,就会遇到痛苦的报错了。在我的尝试中,就有一个Service冲突的问题,网上说需要更改某jar包中的class文件,但是由于项目太过庞大,担心会触发其他的问题,所以我只能就此作罢。

重点来了,第三种AXIS的方式,在我的尝试中是最方便、也没有啥兼容问题的方式了,调用起来非常简便,不需要拼接xml,返回的也只能干净的数据,简直太赞了,如果你在工作中也有这方面的需要,我强烈建议你别折腾了,直接使用AXIS吧!

参考

java调用webservice接口 三种方法
java 使用AXIS调用远程的web service
利用wsdl2java工具生成webservice的客户端代码
java根据WSDL文档,如何调用WebService?

JAVA调用WebService的三种方法相关推荐

  1. java生成验证码的三种方法

    java生成验证码的三种方法 第一种:导入jar包com.github.axet生成法 ①导包 <dependency><groupId>com.github.axet< ...

  2. java解析xml的三种方法

    java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax;import org.xml.sax.Attributes; import org.xml.sax.SAXEx ...

  3. python调用cmd命令释放端口_详解python调用cmd命令三种方法

    目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...

  4. Java 创建线程的三种方法比较

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述Java 创建线程的三种方法比较, 更多Java专业知识,广州疯狂jav ...

  5. php前台调用后台方法,JavaScript_JavaScript调用后台的三种方法实例,方法一:直接使用%=%调 - phpStudy...

    JavaScript调用后台的三种方法实例 方法一:直接使用调用 前台JS: var methodStr = ""; alert(methodStr); 后头方法: public ...

  6. java 获取时间戳 的三种方法

    java 获取时间戳 的三种方法,效率依次递减 方法一 : System.currentTimeMillis(); 方法二: new Date().getTime(); 方法三: Calendar.g ...

  7. Java 键盘输入的三种方法

    Java 键盘输入的三种方法 1.System.in和System.out方法:从控制台接收一个字符,然后将其打印出来 虽然此方式实现了从键盘获取输入的字符,但是System.out.read()只能 ...

  8. 实现java字符串反转的三种方法

    实现java字符串反转的三种方法 1.问题描述:将字符串String="abcdefg"实现反转变成 "gfedcba":用java语言实现. 2.解决方法: ...

  9. 【Java】使用Java调用Python的四种方法

    写在前面 为啥一个好好的岗位是Java开发工程师要去做写python呢?因为产品经理安排的(突然多少有点明白为啥程序员和产品经理会一直开撕).由于在选择企业的时候没看清企业性质,看了要求以为就是互联网 ...

  10. Java创建线程的三种方法

    这里不会贴代码,只是将创建线程的三种方法做个笼统的介绍,再根据源码添加上自己的分析. 通过三种方法可以创建java线程: 1.继承Thread类. 2.实现Runnable接口. 3.实现Callab ...

最新文章

  1. 耗时3天,上亿数据如何做到秒级查询?
  2. 【Android UI设计与开发】第08期:底部菜单栏(三)Fragment+FragmentTabHost实现仿新浪微博底部菜单栏
  3. composer 更新版本
  4. 我是如何指数级提升开发技术的?
  5. How to solve C library not available dtaidistance
  6. 浅谈Python和VC中的编码问题(转)
  7. d3代码如何改造成update结构(恰当处理enter和exit)
  8. 人人都是 DBA(XI)I/O 信息收集脚本汇编(转)
  9. SharePoint REST API - 一个请求批量操作
  10. Python入门--面向过程,面向对象,类与对象
  11. 自定义页面hashmap 方便调用
  12. Maven 清理 .lastUpdated 文件
  13. html怎样改成png格式,如何将jpg图片转换成png格式 又怎样把png转换成jpg
  14. java如何改变图片大小_如何在Java中调整图片大小?
  15. TensorFlow——decay设置
  16. netty Force-closing a channel whose registration task was not accepted by an event loop问题
  17. 微信小程序链接mysql数据库
  18. 十七、电话号码的字母组合
  19. OpenNLP使用小结
  20. 地理坐标系和投影坐标系详解(及坐标系在ArcGIS中的应用)

热门文章

  1. 邱锡鹏神经网络怎么样,邱锡鹏神经网络答案
  2. 三年级计算机测试题,小学三年级信息技术考试试题
  3. 联想m100耗材灯亮_联想m100加粉清零方法
  4. svn代码统计工具使用说明
  5. 智慧医疗整体解决方案及功能介绍
  6. qcc3020定制、qcc3020软件开发tws耳机的注意事项
  7. suse11 升级glibc版本
  8. 2021-08-08在ubuntu上部署nideshop
  9. Android m3u8网络视频播放
  10. zz android touch panel