WebService
本文参考了https://blog.csdn.net/c99463904/article/details/76018436。
一、简介
Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。
简单的说,WebService就是一种跨编程语言和跨操作系统平台的远程调用技术。所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然。跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。 远程调用,就是一台计算机的应用可以调用其他计算机上的应用。例如:支付宝,支付宝并没有银行卡等数据,它只是去调用银行提供的接口来获得数据。还有天气预报等,也是气象局把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能。
XML,SOAP和WSDL就是构成WebService平台的三大技术 。
WebService采用Http协议来在客户端和服务端之间传输数据。WebService使用XML来封装数据,XML主要的优点在于它是跨平台的。
WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议规定的。
WebService服务器端首先要通过一个WSDL文件来说明自己有什么服务可以对外调用。简单的说,WSDL就像是一个说明书,用于描述WebService及其方法、参数和返回值。 WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者。
WebService交互的过程就是,WebService遵循SOAP协议通过XML封装数据,然后由Http协议来传输数据。
二、调用WebService
1、获取WebService的wsdl文档
WSDL(Web Services Description Language), web服务描述语言,他是webservice服务端使用说明书,说明服务端接口、方法、参数和返回值,WSDL是随服务发布成功,自动生成,无需编写。
通过在webservice的URL后面加上"?wsdl"的方式。比如天气预报的的就是http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl
2、阅读wsdl文档
Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)、(入参和出参的数据类型)。
Message - 通信消息的数据结构的抽象类型化定义,使用Types所定义的类型来定义整个消息的数据结构(入参和出参)。
Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对(方法)。
PortType - 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持(服务类)。它可以有一个或多个Operation
Binding - 特定服务访问点与具体服务类的绑定(不看内容,看关系)。
Port - 定义为webservice单个服务访问点。
Service- 相关服务访问点的集合。
WSDL文档应该从下往上阅读。
1.先看service标签,看相应port的binding属性,然后通过值查找上面的binding标签。
2.通过binding标签可以获得具体协议等信息,然后查看binding的type属性
3.通过binding的type属性,查找对应的portType,可以获得可操作的方法和参数、返回值等。
4.通过portType下的operation标签的message属性,可以向上查找message获取具体的数据参数信息。
3、由工具生成客户端代码
有几种方式生成客户端代码,我这里介绍一种方式:使用axis2.
首先去官网下载(http://axis.apache.org/axis2/java/core/download.html),注意下载Binary distribution版的。
然后解压到一个目录。
接着设置环境变量:AXIS2_HOME:D:\software\axis2-1.7.9。后面的是我解压的目录。
然后在PATH后面添加一个:%AXIS2_HOME%\bin
接着去到你想要生成文件的目录打开cmd运行以下命令:
wsdl2java -uri http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl -p com.ltest -s -o stub
-uri后面的参数是wsdl文件的地址,可以是本地,也可以是网络地址。-p后面的是包,-o后面的将要生成的文件目录名。
然后将生成的XXXStub.java文件拖到项目的目录,就可以直接使用了。
import org.junit.Test;
import java.rmi.RemoteException;
public class WebServiceTest {
@Test
public void testWebService() throws RemoteException {
//创建WeatherWebServiceStub对象
WeatherWebServiceStub stub = new WeatherWebServiceStub();
//这是一个内部类
WeatherWebServiceStub.GetSupportCity city = new WeatherWebServiceStub.GetSupportCity();
//设置请求参数
city.setByProvinceName("湖北");
//获得响应
WeatherWebServiceStub.GetSupportCityResponse response = stub.getSupportCity(city);
//将响应解析为另一种类型
WeatherWebServiceStub.ArrayOfString array = response.getGetSupportCityResult();
//再将解析结果转换为字符串数组
String[] string = array.getString();
//构造请求参数
WeatherWebServiceStub.GetWeatherbyCityName getWeatherbyCityName = new WeatherWebServiceStub.GetWeatherbyCityName();
getWeatherbyCityName.setTheCityName("南京");
//获得响应
WeatherWebServiceStub.GetWeatherbyCityNameResponse cityNameResponse = stub.getWeatherbyCityName(getWeatherbyCityName);
//同样解析为另一种类型
WeatherWebServiceStub.ArrayOfString getWeatherbyCityNameResult = cityNameResponse.getGetWeatherbyCityNameResult();
String[] string1 = getWeatherbyCityNameResult.getString();
for (String s : string1) {
System.out.println(s);
}
}
}
上面的例子是使用的免费的天气的WebService接口。可以看出,请求参数与响应都是预先定义好的格式,在发送请求前以及得到响应结果后都需要进行额外的操作。