WebService简单原理分析及使用介绍

1 背景

想要理解Web service,必须先理解什么是Service(服务)。

传统上,我们把计算机后台程序(Daemon)提供的功能,称为"服务"(service)。比如,让一个杀毒软件在后台运行,它会自动监控系统,那么这种自动监控就是一个"服务"。通俗地说,"服务"就是计算机可以提供的某一种功能。

2 什么是WebService

WebService,顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用。我们可以调用互联网上查询天气信息Web服务,然后将它嵌入到我们的程序(C/S或B/S程序)当中来,当用户从我们的网点看到天气信息时,他会认为我们为他提供了很多的信息服务,但其实我们什么也没有做,只是简单调用了一下服务器上的一段代码而已。

Web Services 属于 RPC 的一种

  • Web Services 使用 SOAP 作为传输协议
  • 使用 WSDL 作为服务的描述语言
  • 使用 UDDI 作为服务注册发现(虽然没有发展起来)。

虽然 Web Services 的相关协议在 2007 年之后基本就没再更新,但是在一些银行等金融机构,Web Services 还在被大量使用。WebService 的框架很多,比如 Axis2,XFire,CXF 等等,Apache Cxf 是其中最优秀,最具有生命力的一个,而且 CXF 框架不仅仅是一个 Web Services 框架,甚至可以通过 CXF 来实现 RESTful 风格的服务。

注:以xxx许可证查询接口提供的WebService服务为例 
接口类型:WebService
接口IP:http://meituan.mxwz.cn/

3 WebService基本原理

3.1 基础内容回顾

(1)Scoket与HTTP简述
image.png

(2)网络模型
为了使全世界不同体系结构的计算机能够互联,国际化标准组织ISO提出开放系统互联基本参考模型 ,简称OSI,即所谓的7层协议体系结构。
image.png

采用Http方式进行通通信的问题:

  • 数据封装不够友好​ :可以用xml封装数据
  • 希望给第三方应用提供web方式的服务​ : (http + xml) = web Service
参考:
https://juejin.im/post/6844904049800642568
https://juejin.im/post/6854573218884894734

3.2 WebService 常用术语

(1)XML
Extensible Markup Language,即扩展性标记语言,用于传输格式化的数据,是Web服务的基础。

(2)WSDL
WebService Description Language – Web服务描述语言。WSDL其实大致做了两件事

  • 通过XML形式说明服务在什么地方-地址;
  • 通过XML形式说明服务提供什么样的方法 – 如何调用。

(3)SOAP
Simple Object Access Protocol(简单对象访问协议),SOAP作为一个基于XML语言的协议用于传输数据,简单点说,SOAP是基于HTTP的,SOAP = 在HTTP的基础上+XML数据。

SOAP的组成如下:

  • Envelope – 必须的部分。以XML的根元素出现。
  • Headers – 可选的。
  • Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据。

目前WebService的协议主要有SOAP1.1和1.2,其差别主要体现在下面几个方面:

  • 两者的命名空间不同

Soap1.1的命名空间:

xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"

Soap1.2 命名空间:

xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"
  • SOAP1.1版本与SOAP1.2版本在头信息上存在差异。
    SOAP1.1存在SOAPAction的请求头。
    SOAP1.2没有SOAPAction的请求头。

  • 基于SOAP1.1生成的WSDL和基于SOAP1.2生成的WSDL也不一样。 主要看命名空间。

  • 在CXF中两种协议请求的方式也不一样。
    1.1为content-Type:text/xm;charset=UTF-8
    1.2为content-Type:application/soap+xml;charset=UTF-8

(4)UDDI

Universal Description, Discovery, and Integration 是一个它是目录服务,通过该服务可以注册和发布webservcie,以便第三方的调用者统一调用,主要针对Web服务供应商和使用者的新项目。在用户能够调用Web服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。它采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。

3.3 WebService 基本架构

以HTTP协议为基础,通过XML进行客户端和服务器端通信的框架/组件

两个关键点:

  • 通过xml描述服务端提供的功能;
  • 第一步中的描述的功能, 嵌入到HTTP协议中, 使得能通过HTTP协议进行通信【所谓的SOAP】.

(一)WebService的简要表示

WebService的简要表示可以如下图表示:
image.png

采用这两个技术的目的主要优点是:

  • 跨平台, 支持HTTP协议的主机和服务器, 都能够建立通信联系, 并且大部分的主机和服务器(99.999%以上)将支持HTTP协议。一般而言,不同目标主机之间的通信,需要通过防火墙,打开某个端口, HTTP协议的优势在于,防火墙一般不会封掉80端口, 这样就可以方便,安全的通信。
  • 跨语言, 任何语言, 都支持XML文本解析, 这个的目的是为了实现不同语言之间的通信, 通信的内容,是被xml限制的,因此这样进行通信,能跨越语言障碍,即, Java开发的服务端,客户端可以用C访问, 可以用java,VB等访问, 反之亦然。

(二)基本的WebService架构流程图

当然,架构比我们上面说到的图要更为复杂,上面只是说明了一来一回的通信, 实际情况还需要考虑以下问题, 基本的WebService架构流程图参照图例说明:
image

  1. 服务器端(Provider) 提供统一的标准化服务。就像开办一个公司(即Server Provider), 工商行政管理局,注册一下公司地址和性质。目的是, 别人要用公司的服务,从工商管理局就知道你的地址。这样统一的做法,是方便所有的公司以及所有需要公司提供服务的客户。并且这些信息是最大限度的公开。

  2. 客户端(Requester) 到注册中心(Registry)拿到公司的基本信息之后, 去找到这个公司, 然后使用该公司提供的服务。

(三)更加详细的架构图

image.png

上图这些东西, 完完整整的呈现了WebService的整个原理流程:

详细步骤如下:

  1. Client有需要,想调用一个服务,但不知道哪里去调用. 但知道UDDI Registry上可以查到。
  2. 果然UDDI记录了某个一个叫做Web Server A的服务器能提供这样的服务。
  3. 于是Client去Web Server A, 询问确切的调用方法。
  4. Web Server A看到Client提出的“确切方法查询”之后,立即返回给它一个WSDL描述的xml文档这里记录他能提供的各类方法接口.
  5. Client了解到这些之后,将这些xml的接口方法,封装成为HTTP请求, 发给Web Server A. 这些封装方式采用的是标准的SOAP方式, 实质是满足HTTP协议的一些SOAP的报文消息。
  6. Web Server A回应的也是HTTP协议的SOAP包. 这样双方的请求-响应完全畅通。

4 WebService的使用
4.1 SOAP调用
以下是 SOAP 1.2 请求和响应示例。所显示的占位符需替换为实际值。

POST /WebService.asmx HTTP/1.1
Host: meituan.mxwz.cn
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
​
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <getXKXX xmlns="http://tempuri.org/">
      <xkzbh>string</xkzbh>
    </getXKXX>
  </soap12:Body>
</soap12:Envelope>
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
​
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <getXKXXResponse xmlns="http://tempuri.org/">
      <getXKXXResult>string</getXKXXResult>
    </getXKXXResponse>
  </soap12:Body>
</soap12:Envelope>

4.2 http调用
(1) 以下是 HTTP GET 请求和响应示例,所显示的占位符需替换为实际值。

# 请求
GET /WebService.asmx/getXKXX?xkzbh=string HTTP/1.1
Host: meituan.mxwz.cn
# 响应
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
​
<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">string</string>

(2) 以下是 HTTP POST 请求和响应示例,所显示的占位符需替换为实际值。

# 请求
POST /WebService.asmx/getXKXX HTTP/1.1
Host: meituan.mxwz.cn
Content-Type: application/x-www-form-urlencoded
Content-Length: length
​
xkzbh=string
# 响应
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
​
<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">string</string>

上面我们使用的是GET方式或者使用POST方式来调用webservice的服务,其实这两种方式也有弊端:

  • 传递参数麻烦【get方式都写在请求地址上、post方式要一个一个封装】
  • 解析结果麻烦【根据返回的XML来解析字符串】

如果我们可以把整个对象传递进去,返回的结果更加友好的话,就好像我们平常调用Java类一样使用webservice就好咯!

Java也提供了类似的方法,把webservice服务搞成是Java类让我们自己调用,既然是Java类的话,那么我们使用起来就非常方便了。

4.3 wsimport

为了解决上面提到的问题,于是wsimport登场了,wsimport是JDK自带的一个命令,我们想要使用该命令,就必须配置环境变量,并且jdk的版本最好是1.7或以上

wsimport使用: wsimport命令后面跟着的是WSDL的url路径 语法

wsimport [opations] <wsdl_uri>
  • wsdl_uri: wsdl 的统一资源标识符
  • d: 指定要输出的文件的位置 复制代码
  • s: 表示要解析java的源码 ,默认解析出的是class字节码 复制代码
  • p: 指定输出的包名
 wsimport -s . http://meituan.mxwz.cn/WebService.asmx?WSDL

然后我们来看一下到底生成了些什么东西

把webservice服务搞成是Java类让我们自己调用其实就是Java帮我们生成本地代理,再通过本地代理来访问webservice!

值得注意的是,本地代理仅仅是有其方法,类,并不能解析出具体的实现的,具体的操作其实还是webservice去完成的,于是代理这么一个概念就更加清晰了。

wsimport有个很大的缺陷:

wsimport 是根据JDK1.6.0_21及以上的生成本地代码的,它只能解析服务器端的SOAP协议为1.1,不能解析SOAP1.2的协议。如果解析SOAP1.2 将会解析不完全。

4.4 CXF

Apache CXF 是一个开源的 Services 框架,CXF 帮助您来构建和开发 Services 这些 Services 可以支持多种协议,比如:SOAP、POST/HTTP、RESTful HTTP CXF 大大简化了 Service可以天然地和 Spring 进行无缝集成,CXF也提供了根据WSDL生成客户端代码的命令wsdl2java,CXF特点如下:

  • 与Spring、Servlet做了无缝对接,cxf框架里面集成了Servlet容器Jetty
  • 支持注解的方式来发布webservice
  • 能够显示一个webservice的服务列表
  • 能够添加拦截器:输入拦截器、输出拦截器 :
  • 输入日志信息拦截器、输出日志拦截器、用户权限认证的拦截器

(1)下载安装

  1. JDK环境

  2. 下载apache-cxf发布包:http://cxf.apache.org/download.html 目前最新版本为3.4.0
    image.png

  3. 配置环境变量(也可以省略)

./wsdl2java -help

(2)生成本地代理

./wsdl2java http://meituan.mxwz.cn/WebService.asmx?WSDL

(3)具体使用案例

WebService webService = new WebService();
WebServiceSoap webServiceSoap12 = webService.getWebServiceSoap12();
String xkxx = webServiceSoap12.getXKXX("CY12113020000897");
System.out.println(xkxx);

运行结果如下:

双塔区日东饺子馆;;王日东;CY12113020000897;朝阳市双塔区行政审批局;2018/7/9 0:00:00;2021/4/8 0:00:00;朝阳市;ALL13;双塔区;ALL1302;辽宁省朝阳市双塔区淮河路三段35号-37;普通小餐饮;

5 参考文献

https://blog.csdn.net/nikita1995/article/details/84064201
https://juejin.im/post/6844903577127747598

https://www.jianshu.com/p/69726b1ed378

https://segmentfault.com/a/1190000023735006

https://websec.readthedocs.io/zh/latest/basic/history.html

https://blog.csdn.net/c99463904/article/details/76018436

https://www.cnblogs.com/xdp-gacl/tag/WebService%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/

更新时间:2020-09-15 21:40:03

本文由 清水河恶霸 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:http://ql.magic-seven.top/2020/09/15/webservice简单原理分析及使用介绍.html
最后更新:2020-09-15 21:40:03

评论

Your browser is out of date!

Update your browser to view this website correctly. Update my browser now

×