JAVA调用WebService的三种方法

2023-11-10

这两天一直在做外系统对接,对方的接口是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?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA调用WebService的三种方法 的相关文章

随机推荐

  • NAT介绍

    在传统TCP IP通信过程中 所有的路由器仅仅是充当一个中间人的角色 也就是通常 所说的存储转发 即路由器不会对转发的数据包进行修改 准确地讲 除了将源MAC地址 换成自己的MAC地址以外 路由器不会对转发的数据包做任何修改 而NAT恰恰是
  • J2EE-007 反射+BaseServlet实现

    因为之前都是用的幕布进行文章发布现在移动到这里进行统一管理 文章我就不再编写了 后面会用CSDN进行编写 望审核给与通过谢谢 https share mubu com doc 3hGLbDxQhQV
  • Linux进程间通信——eventfd

    Table of Contents 什么是eventfd 创建eventfd 读eventfd 写eventfd 使用例子 什么是eventfd eventfd是Linux 2 6提供的一种系统调用 它可以用来实现事件通知 eventfd包
  • 《深入理解计算机系统》实验五Cache Lab

    前言 深入理解计算机系统 实验五Cache Lab下载和官方文档机翻请看 https blog csdn net weixin 43362650 article details 121989400 我觉得这个文档对整个实验很有帮助 对于我来
  • CTracker

    https github com pjl1995 CTracker 本机可以跑 jacke121 CTracker master 可视化 demo show py 效果不是特别好 论文地址 https arxiv org pdf 2007
  • Python 生成随机各类字符串

    Python 生成随机各类字符串 Python 生成随机字符串 包括字符和数字组合 大写字符串 小写字符串 参数 字符数量 数字数量 def random stringdigit letter count digit count str1
  • 软件测试之从0到1完成UI自动化测试框架搭建系列(3)

    上节 我们讲了下 如何运用uiautomator2 atx pytest进行自动化的单元测试 这节 我们再思考下 如果我们每条用例 都去一步一步 先元素定位 然后写操作 然后写各种方法 那这个代码量是不是就有点偏多了 另外也不方便维护 比如
  • win10操作系统jdk11不带jre的解决办法、单/多版本jdk环境变量的配置、javac不可用的解决方法

    目录 win10操作系统jdk11不带jre的解决办法 两个java版本的jdk环境变量的配置 只有一个java版本时只需设置以下变量 怎么解决javac不可用的问题 win10操作系统jdk11不带jre的解决办法 在开始菜单中寻找命令提
  • 时钟抖动(Jitter)的基本概念

    随着通信系统中的时钟速率迈入GHz级 抖动这个在模拟设计中十分关键的因素 也开始在数字设计领域中日益得到人们的重视 在高速系统中 时钟或振荡器波形的时序误差会限制一个数字I O接口的最大速率 不仅如此 它还会导致通信链路的误码率增大 甚至限
  • android五大布局之LinearLayout

    初次接触android的同学 最先接触的也就是android的布局了 因为android的代码与界面是分开的 因此想要界面显示什么 布局应该是第一步 就像一个孩子生下来你要给他穿衣服一样 因此 我们现在所写的布局就是你看到项目运行的界面 L
  • MATLAB 快速傅里叶变换(fft)结果为什么是复数?

    文章核心是两部分 1 从直观和本质的角度 说明为什么快速傅里叶变换的结果是复数 2 详细说明了MATLAB中fft函数的运用方法 并给出了fft幅度谱的求解代码 但要真正了解快速傅里叶变换 核心是理解 FFT的计算原理 目录 一 直观解释
  • MySQL和SQLite的区别

    简单来说 SQLITE功能简约 小型化 追求最大磁盘效率 MYSQL功能全面 综合化 追求最大并发效率 如果只是单机上用的 数据量不是很大 需要方便移植或者需要频繁读 写磁盘文件的话 就用SQLite比较合适 如果是要满足多用户同时访问 或
  • Self-Attention和CNN的优雅集成,清华大学等提出ACmix,性能速度全面提升

    清华大学等提出了一个混合模型ACmix 它既兼顾Self Attention和Convolution的优点 同时与Convolution或Self Attention对应的模型相比 具有更小的计算开销 实验表明 本文方法在图像识别和下游任务
  • 因果关系的判断?

    最简单的方法是从相关性 先后顺序 排除干扰因素三个方面下手 简化版 1 两件事 A与B 相互关联 Association 2 A的发生可以预测B的发生 Prediction 3 排除其他可能的混淆变量 Excluding Confoundi
  • HTTP协议的理解

    目录 简介 HTTP URL HTTP请求 HTTP请求状态行 HTTP请求头 HTTP协议详解 HTTP的五大特点 非持久连接和持久连接 HTTP和HTTPS HTTP的不足 HTTPS介绍 简介 HTTP协议 超文本传输协议HyperT
  • 人工智能之产生式系统(c++实现)

    这次的人工智能实验是产生式系统 动物分类 规则库 R1 动物有毛发 哺乳类 R2 动物有奶 哺乳类 R3 动物有羽毛 鸟类 R4 动物会飞 会下蛋 鸟类 R5 哺乳类 动物吃肉 食肉动物 R6 动物有犬齿 有爪 眼盯前方 食肉动物 R7 哺
  • .NET 数据类型转换 方法

    using Newtonsoft Json using Newtonsoft Json Converters using System Web Script Serialization
  • 4-2 数据结构--二分搜索

    描述 给定一个由 n 个整数组成的序列 S 和一个由不同的 q 个整数组成的序列 T 编写一个程序 输出 C 即既在序列 T 中也在集合 S 中的整数个数 输入 在第一行中给出了 n 在第二行中 给出了 n 个整数 在第三行中给出了 q 然
  • 经典 55道 MySQL面试题及答案

    前言 MySQL面试题以及答案整理 最新版 MySQL高级面试题大全 发现网上很多MySQL面试题都没有答案 所以花了很长时间搜集 本套MySQL面试题大全 汇总了大量经典的MySQL程序员面试题以及答案 包含MySQL语言常见面试题 My
  • JAVA调用WebService的三种方法

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