SpringBoot2.x系列教程78--Web Service详细讲解
作者:一一哥
一. Web Service详解
1. Web Service的概念
我们先来看看百度百科给出的定义:
- Web Service是一个平*立的,低耦合、自包含的,基于可编程的Web应用程序,可使用开放的XML标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。
- Web Service技术能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,就可以相互交换数据或集成。依据Web Service规范实施的应用之间,无论它们所使用的语言、平台或内部协议是什么,都可以相互交换数据。Web Service是自描述、自包含的可用网络模块,可以执行具体的业务功能。Web Service也很容易部署,因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。
当然上面的内容,对于初学者来说有点晦涩,我们可以一句话提取一下核心信息:
Web Service是一种跨编程语言和跨操作系统的远程调用技术。
也就是说,Web Service 其实是一个可以作为服务器的应用程序,它会向外界暴露出一个接口API,该API能够通过Web技术被调用。
我们能够用编程的方法通过Web技术来调用这个Web Service应用程序。而我们把调用这个Web Service 的应用程序叫做客户端程序。
2. Web Service具体使用场景
假如我们自己的网站项目中需要实现一个天气预报的功能,那我们该怎么做?
对我们来说,天气预报这个功能只是我们网站中一个稍显人性化的用来提高用户体验的小功能,其实是可有可无的功能。但是这个小功能的实现却并不是简单的JS组件就能够实现的,因为天气预报每天的数据都是不一样的,我们自己是不可能有这样的天气数据的,我们也没必要为了这么一个小功能就去创建专门的数据库来保存天气数据。
那么怎么办?
但是当我们在网上搜索天气信息的时候,就会发现其实有很多提供天气信息的网站,比如国家气象局网站,这样的机构对外提供了天气信息这样的数据。那么我们能不能想办法从国家气象局这种第三方的机构项目上获取到我们想要的天气信息呢?如果可以获取,那么该用什么技术实现呢?
于是乎,Web Service技术就诞生了。也就是说,只要国家气象局网站利用Web Service技术向外界暴露出一个能够通过Web技术进行调用的API接口,当我们想要获取天气预报的信息,直接调用气象局已经写好的这个Web Service服务,就能够调用得到我们想要的结果了!
当然,前提是对方得按照Web Service相关的协议规范对外暴露接口才行。
但是在这个过程中,也存在几个问题,我们想去调用别人项目中的接口,不是说我们想调用就能调用的,是不是得遵循别人的一些规则?
所以我们需要先弄明白,Web Service中需要有哪些协议规范?客户端程序与Web Service程序之间应该用什么格式的载体来传递数据?
3. Web Service中的协议规范
- XML和XSD
XML: 可扩展的标记语言(标准通用标记语言下的一个子集),是Web Service平台中表示数据的基本格式。除了易于建立和易于分析外,XML主要的优点在于它既与平台无关,又与厂商无关。XML是由万维网协会(W3C)创建,W3C制定的XML SchemaXSD 定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。
XSD: XML Schema Definition,Web Service平台用XSD来作为数据类型系统。当你用某种语言如VB. NET或C# 来构造一个Web Service时,为了符合Web Service标准,所有你使用的数据类型都必须被转换为XSD类型。
- SOAP
简单对象访问协议(Simple Object Access Protocol),它是用于交换XML,编码信息的轻量级协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定。SOAP可以运行在任何其他传输协议上。
- WSDL
Web Service描述语言,就是用机器能阅读的方式提供的一个基于XML且具有正式描述文档的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。
- UDDI
UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。
- 调用RPC与消息传递
Web Service本身其实是在实现应用程序间的通信。我们有两种应用程序通信的方法:RPC远程过程调用和消息传递。
使用RPC的时候,客户端的概念是调用服务器上的远程过程,通常方式为实例化一个远程对象并调用其方法和属性。RPC系统试图达到一种位置上的透明性:服务器暴露出远程对象的接口,而客户端就好像在本地使用的这些对象的接口一样,这样就隐藏了底层的信息,客户端也就根本不需要知道对象是在哪台机器上。
4. Web Service程序之间数据传输的载体-XML
我们还是以获取气象局网站的天气信息为例来说明这个问题。
首先我们不知道气象局的网站是用什么技术来实现的,可能是Java、.net、PHP等;而我们自己的项目也可能与气象局网站的技术完全不同,可能是Java,也可能是Android,也可能是iOS,所以这两者之间可能技术完全不同。那么这两者之间该用什么样的载体来传递这个天气信息呢?
其实无论是Java、.net、PHP等任意技术的平台,只要是Web开发都可以通过http协议来进行通信,并且如果要返回通用数据的话,其实我们可以使用之前就学过的一种技术【XML】!
所以Web Service的本质实际上就是Http技术+XML技术。

5. Web Service的两种类型
- 一种是以SOAP协议风格的Web Service;
- 一种是Restful风格的Web Service。
6. SOAP风格的Web Service

从上图中可以看到,SOAP风格的Web Service中,包含以下WebService的核心组件:
- XML和HTTP;
- SOAP: 简单对象访问协议;
- WSDL: WebService描述语言;
- UDDI: 统一描述、发现和集成协议。
7. 实现Web Service的主流框架

7.1 AXIS
AXIS(Apache eXtensible Interaction System)是Apache的可扩展交互系统。
AXIS是一款开源的Web Service运行引擎,本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。
AXIS分为1.x系列和2系列,两个系列体系结构和使用上有较大的区别,相对而言,Axis1.x更加稳定,文档也比较齐全。
官网:http://axis.apache.org/
7.2 XFire
XFire 是下一代的Java SOAP框架。
XFire 提供了非常方便的API,使用这些API可以开发面向服务(SOA)的程序。它支持各种标准,性能优良(基于低内存的STAX 模型)。
官网:http://xfire.codehaus.org/
7.3 CXF
Apache CXF = Celtix + XFire。
Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF了,以下简称为CXF。
CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache*项目。
8. Web Service客户端的几种实现方式
8.1 Wsimport实现方式
8.2 service实现方式
8.3 HttpURLConnection调用方式
8.4 Ajax调用方式
注意:
利用ajax jsonp无法实现跨域,因为Web Service服务的响应格式为xml格式。