一、介绍
1.1 概述
不同平台、不同语言、不同机器的应用间程序实现通信,服务器暴露出远程对象的URI
client引入地址+Service+实体类(形式:提供jar包,或者基于xml格式的接口文档执行脚本生成),便可以直接调用对应方法,实际上是host:port/url,会转换为soap协议的xml文件,
服务列表(更可读,展示全部的SEI):http://172.16.21.131:8080/myService
wsdl接口文档(针对单个SEI),http://172.16.21.131:8080/myService/api?wsdl
1.2 流程
1.3 相关术语
WebService交互的过程就是,WebService遵循SOAP协议通过XML封装数据,然后由Http协议来传输数据。
XML,SOAP和WSDL就是构成WebService平台的三大技术
1、XML(数据和文件格式)
可扩展的标记语言(标准通用标记语言下的一个子集),是Web Service平台中表示数据的基本格式,是Web Service程序之间数据传输的载体
与平台无关,又与厂商无关。XML是由万维网协会(W3C)创建,W3C制定的XML SchemaXSD 定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。
web/应用开发中,通过http协议来进行通信,使用xml文件返回通用数据
2、XSD(XML标准数据类型)
W3C制定的标准数据类型,用于描述消息
XML Schema Definition,Web Service平台用XSD来作为数据类型系统。当你用某种语言如VB. NET或C# 来构造一个Web Service时,为了符合Web Service标准,所有你使用的数据类型都必须被转换为XSD类型。
3、SOAP(XML的协议风格=HTTP+XML)
SOAP(Simple Object Access Protocol,简单对象访问协议),它是用于交换XML,编码信息的轻量级协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定。SOAP可以运行在任何其他传输协议上。
提供标准RPC方法实现调用web service
类似方式:REST
4、WSDL(接口文档)
Web Service描述语言,就是用机器能阅读的方式提供的一个基于XML且具有正式描述文档的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。
标签解读,可以参考:https://mp.weixin.qq.com/s/gaTSD0BIh2olZ6TIFU-yBg
5、UDDI(服务注册表,类比nacos)
Universal Description Discovery and Integration,用于描述、发现、集成Web Service的技术
是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。
6、SEI&SBI(对应的service)
SEI:WebService EndPoint Interface(终端),简言之就是服务器端用来处理请求的接口
SBI:SEI接口的实现类
需要通过EndPoint发布,客户端才能使用
7、JAXM&SAAJ、JAX-WS(JAX-RPC)、JAX-RS(Java中的web service规范)
Java API for XML-Based Web Services (JAX-WS)
通过@WebService 和 @WebMethod 注解指定web service方法
参考地址:在基于 SEI 的 JAX-WS Web Service 中公开方法 - IBM 文档
8、SOA(面向服务的架构)
SOA(Service-Oriented Architecture,面向服务的架构)是一种架构设计方法,它通过将应用程序分解为可重用、松散耦合的服务来优化跨不同系统和平台的业务流程。
服务可以通过企业服务总线(ESB)进行集成和管理,实现服务的发现、路由和协议转换等功能。
对比微服务(业务粒度&目标)
9、wsimport(自动生成客户端代码的命令行工具)
wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码)
样例:
wsimport -p cn.cad.mobile -s . http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
wsimport -s . D:\git\webservice-public-translation\src\main\java\EnglishChinese.xml
二、实战
2.1 相关框架
1、XFire
XFire 是下一代的Java SOAP框架。
XFire 提供了非常方便的API,使用这些API可以开发面向服务(SOA)的程序。它支持各种标准,性能优良(基于低内存的STAX 模型)。
2、Apache CXF(=Celtix+XFire)
Celtix是Apache CXF的前身
CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目。
对应依赖:cxf-spring-boot-starter-jaxws=cxf-rt-transports-http+cxf-rt-frontend-jaxws
3、Apache Axis
AXIS(Apache eXtensible Interaction System)是Apache的可扩展交互系统。
AXIS是一款开源的Web Service运行引擎,本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。
AXIS分为1.x系列和2系列,两个系列体系结构和使用上有较大的区别,相对而言,Axis1.x更加稳定,文档也比较齐全。
2.1 天气预报
1、下载并修改wsdl文件
(1)下载
地址:WEB服务(Web Servicrs)| 免费WEB服务 | 商业WEB服务 | XML Web Servicrs - WEBXML
(2)修改标签元素
原因:.net 开发报错
2、新建maven项目&wsdl文件放到指定目录
3、运行wsimport命令生成class字节码文件
wsimport -s . D:\git\webservice-public-weather\src\main\java\WeatherWebService.xml
4、编写调用方法
package cn.com;
import cn.com.webxml.ArrayOfString;
import cn.com.webxml.WeatherWebService;
import cn.com.webxml.WeatherWebServiceSoap;
import java.util.Objects;
public class WeatherInvokeApp {
public static void main(String[] args) {
name();
}
public static void name() {
//创建实例化对象
WeatherWebService weatherWS = new WeatherWebService();
//通过实例化对象创建接口
WeatherWebServiceSoap serviceSoap = weatherWS.getWeatherWebServiceSoap();
ArrayOfString arrOfShandong = serviceSoap.getSupportCity("山东");
if (Objects.nonNull(arrOfShandong)) {
arrOfShandong.getString().forEach(System.out::println);
}
//传入城市,获取当前城市天气状况
ArrayOfString arr = serviceSoap.getWeatherbyCityName("52082");
if (null != arr) {
//获取到对象转换成集合遍历
for (String message : arr.getString()) {
System.out.println(message);
}
}
}
}
2.2 整合Spring Boot
1、参考过程
爆破专栏丨SpringBoot2.x系列教程之整合Web Service实现远程接口调用(57) (qq.com)
2、相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
<version>2.7.12</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.12</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.12</version>
</dependency>
对应依赖:cxf-spring-boot-starter-jaxws
3、项目框架
4、调用
2.3 其他
1、用户名密码/常用信息拦截-客户端&服务端开发
2、hutool提供SoapClient,通过SOAP接口调用服务端&Postman传递xml访问
SpringBoot项目使用CXF框架开发Soap通信接口_cxf-spring-boot-starter-jaxws-CSDN博客