本文都是本人对技术的总结描述,不那么官方,可能会有些许的问题,欢迎指正
1. 什么是WebService
WebService可以理解成是多个系统之间进行通讯的一种技术,它具有跨平台通讯的特点,使得多个系统之间的通讯方式更加多样;底层通讯协议使用的是http;
2. WebService的使用场景
一般跟国企或者银行进行数据对接的时候会使用
3. WebService中的几个概念
- wsdl:相当于是对webservice发布服务接口的信息描述
- soap协议:相当于是规定了http请求中请求体的格式规范(协议就相当于是一种规范),它和http本质都是底层的通信协议,只是请求包的格式不同,soap包是XML格式,http包纯文本格式
- UDDI:UDDI 是一种目录服务,企业可以使用它对 WebServices 进行注册和搜索
4. WebService客户端访问服务端的大体流程
客户端通过UDDI目录服务找到某个WSDL描述文档,然后客户端通过分析描述文档向服务端发送一个http请求(该请求符合soap协议规范),最后服务端分析客户端发送过来的请求体,也通过soap协议解析出内容,并且再次以http的方式将数据封装到请求体(该请求符合soap协议规范)中并返回给客户端。
打个比喻来说:相当于是一个人(客户端)如果想要点外卖(获取数据),那么会通过比如美团(UDDI)找各个商家并且分析下他们家的菜品(WSDL),然后这个人通过交钱的方式(SOAP协议)去购买商品。
5. 详解WSDL文件
我们可以通过wsdl文件分析出接口信息,那么wsdl怎么看呢?看完下图之后,我相信你有自己的理解了

- wsdl:definitions

- wsdl:types

- wsdl:message

- wsdl:portType

- wsdl:binding

- wsdl:service

6. Soap协议
什么是Soap协议?既然它是一种协议,那么说明这个就是一种规范,他规范什么呢?他规范的是Http请求中请求体的规范,只有客户端和服务端两端都遵守这种规范才能够顺利解析出请求体中的内容。soap协议具体内容可以去百度,这里就不再赘述,放上一张soap协议体的内容,相信看完这张图你应该明白了什么是soap协议

7. 实战
本文使用jdk1.8,Apache-cxf 3.0.5
- 需要的依赖(注意:这两个依赖的版本号最好相同,否则可能会报错)
<!-- apache-cxf-ws start -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.0.5</version>
</dependency>
<!-- apache-cxf-ws end -->
- 服务端代码

- 接口Service(注意:接口上需要加上@WebService注解,否则客户端找不到该服务)

- 实现类

- 客户端(这里的地址配置的为Tunnellij代理地址,Tunnellij在下文有介绍)

8. 什么是JAX-WS和JAX-RS
-
JAX-WS规范是一组XML web services的JAVA API,它运行时实现会将这些API的调用转换成为对应的SOAP消息, 是Sun公司提出的一套关于WebService的开发标准;
-
JAX-RS = Java API For Restful Web Services(JSR311) JAX-RS是JAVAEE6引入的一个新规范。是一个Java编程语言的应用程序接口,支持按照表述性状态转移(REST)架构风格创建Web服务。 JAX-RS使用了JavaSE5引入的Java标注来简化Web服务的客户端和服务端的开发和部署。
-
如果WebService使用Rest风格的话,那么就不用走soap协议了,也就没有wsdl文件了
-
JAX-RS规范下的WebService客户端和服务器端通信的数据可以是XML格式也可以是JSON格式
-
JAX-RS:Rest协议+XML/JSON(不需要服务端的接口了)可以使用HttpClient或者WebClient进行调用
-
JAX-WS:Soap协议+XML
9. 拓展
-
在与对方进行WebService接口对接的时候,需要问清楚对方服务端是使用什么框架实现的,并且用的是什么规范,比如jax-ws或者jax-rs,因为有可能你服务端用的axis框架,客户端用的cxf框架,调用不到,别问我为什么知道
-
在调用对方出现错误的时候,可能出现一些很奇怪的报错,如果不是代码的问题,那么可能是实际参数的值不对,本人在和第三方对接时,竟然因为一个实参少了一个英文字母导致怀疑人生
-
文中抓取soap协议内容使用的是Tunnellij插件,在使用的时候,首先配置下Tunnellij插件的代理地址及端口,然后在客户端调用的时候访问地址为Tunnellij插件的代理地址
