文章目录
[引言] "WebService"一词的历史包袱
先来看一下什么是"WebService"的历史包袱
- 知乎
- REST深入剖析及实践策略研究(赵峰-2009年河北大学工学硕士学位论文)
(这篇论文中说WebService是一种规范或标准,我认为不对,WebService是一个概念,不是技术,也不是规范或标准。不过这不是重点,它描述出的’人们将WebService看做为一个技术’ 这个现象才是我们关注的重点)
由于一些历史遗留问题,以及互联网资料的更新不及时。导致目前有一个错误的现象:我们在搜索"WebService是什么"之类的资料时,得到的大多都是和XML、SOAP、WSDL、UDDI相关的某个技术
这种情况在国内搜索结果中表现得最明显,国外稍好
(【资源】快照:当前对“WebService“的搜索结果)
百度百科-Web Service 将WebService解释为是一种技术
知乎-webservice
wiki百科(Web service)的解释稍好一些
对于刚入坑的同学来说,WebService会被大脑自动翻译为比较容易理解的"Web服务",认为这应当是一个互联网概念。但当这些搜索结果映入眼帘后,显然与第一印象有很大的不同,接着给人的反应是:嗯?这是什么?有这么复杂吗?WebService到底是什么?
从目前的资料来看,对"WebService"一词的解释主要有两个:
- 一个互联网概念:“web服务”。 ——“WebServices”
- 一个用于构建"web服务"的基于SOAP、XML的技术。这个理解在搜索结果中占比最大,最传统。 ——“SOAP-WebService”
可见,WebService是一个混淆了两种意思的词语
本文将在努力摆脱历史包袱的基础上进行WebServices详解,会大量使用:WebServices(Web服务概念)、SOAP-WebService(基于SOAP实现WebServices的技术)、SOAPful WebServices(用SOAP-WebService技术实现的Web服务) 等名词区分概念
摘要
本文简述WebServices,以及目前构建WebServices的两种方式,可以让入门者迅速了解web服务的常识
在每一个关键点,都放置了延伸阅读的超链接,读者可以按需深入了解
WebServices(web服务)
WebServices,即web服务,是一个互联网概念。是指使用web技术(url、http等)提供的信息服务,用来实现分立系统(分布式系统、异构系统)的信息交换。
WebServices的由来:2000年左右,人们普遍认识到基于公共互联网之上的电子商务具有极大的发展潜力,因此需要创建一套全新的基于互联网的开放通信框架,以满足企业对电子商务中各分立系统之间通信的要求。于是,人们提出了Web服务(WebServices)的概念,希望通过将企业对外服务封装为基于统一标准的Web服务,实现异构系统之间的简单交互。
这是web服务的由来。web是为"企业对外服务"而提出的,但其实只要是用web技术提供的服务都属于web服务,它们没有本质上的区别。比如同一个公司开发的服务端向浏览器端提供的服务,这也属于web服务
web服务创建后,不仅可以用于纯粹的web系统,很多种类的系统都可以调用web服务,只要它们使用web协议。例如QQ客户端(不属于web系统)界面显示的天气信息,很可能就是通过调用某个天气web服务获取的。
web服务的调用形式分两种:一个服务器向另一个服务器调用、客户端向服务器调用。(非重点)
之所以这么分,有两个原因
- 在以前,面向web客户端的web服务 与 面向服务器和其它非web系统的web服务 有些区别。这主要是因为web客户端通常都是使用js来编写程序。在Ajax出现之前,js每次请求必须获取一个完整的HTML页面,替换发起请求的用户界面。Ajax出现之后,js才可以直接请求纯数据信息填充到现有页面。
- 客户端向服务器调用web服务,通常仅会让客户端调用本公司提供的服务。第三方提供的服务不应该直接由客户端发起,因为客户端的行为是不可控的,很可能会导致过度调用,或暴露服务秘钥。而第三方服务基本都是要花钱买的,这会为公司造成经济损失。
如今的web服务主要有两种形态,一种是早期的SOAPful WebServices,一种是后来一直到现在最流行的RESTful WebServices
这在Oracle的JavaEE文档中有明确的表示。
(“Big” Web Services 就是指SOAPful WebServices。SOAPful WebServices在当时没有一个合适的名字,这个名字也是我取的,后面会讲)
oracle-WebServices的类型
一、SOAPful WebServices
SOAPful WebServices是一种早期的(2000年初流行的)WebServices的形态,它使用SOAP-WebService技术构建/实现。
SOAP-WebService,就是占据了"WebService(s)“搜索结果中最大比重的所谓"基于SOAP的技术”(本文开头所讲)。当时这项技术的官方名字就叫"WebService(s)",恰有一幅喧宾夺主的样子,这是造成"WebService(s)“一词被混淆的源头,显然不合适。
所以我把它叫做SOAP-WebService,而用它构建出的WebServices就叫做 SOAPful WebServices
(因为SOAP是基于XML的,所以有的资料也叫它"XML-WebService”,但这个名字不如SOAP-WebService贴切)
简而言之:SOAP-WebService是一个早期的基于SOAP的用于构建WebServices的技术。而用它构建出的WebServices就叫做 SOAPful WebServices
SOAP-WebService估计很多人都没有用过,文字资料不是很直观,推荐看一些视频,能快速了解其基本概念和开发流程:
(注意,在这里资料里它还是叫"WebService"哦!)
java进阶教程之webservice深入浅出【黑马程序员】:这个视频两个小时,可以快速过一遍。唯一的缺点是没有讲到用wsdl来生成代码(而是客户端代码直接copy了服务端的服务接口代码)。
使用wsdl生成代码可以看:千锋教育WebService全套实战教程,深入浅出学习WebService
- 使用 wsimport 生成代码:P3 (03_第二种调用服务的方式&服务升级的处理)
- 使用 wsdl2java 生成代码:P12 (12_CXF发布服务和访问服务)
SOAP-WebService,是早期软件巨头们(IBM、Microsoft等)定义的"用来构建WebServices的技术/技术栈/标准"(这个"WebServices"就是本文描述的"SOAPful WebServices"),它本质上其实是一个RPC
SOAP-WebService技术以SOAP、WSDL、UDDI为三核心:
-
SOAP(Simple Object Access Protocol): 即简单对象访问协议。它是一个基于XML的通信协议。它由三部分组成:定义一个XML的SOAP消息结构、将程序对象编码为XML的规则,远程过程调用和响应的表示规则。SOAP可以使用多种协议进行传输,比如HTTP/HTTPS、SMTP、TCP等,但通常绑定于HTTP/HTTPS。
-
WSDL(Web Services Description Language):即Web服务描述语言。是一个描述SOAP-WebService接口的函数、参数、返回值等(相当于现在流行使用的protobuf中的proto文件)的可供机器读取的接口描述文档。用来生成服务的接口代码供调用(比如java的wsimport命令和wsdl2java工具,c/c++ c# php等都有对应的生成代码的工具)
延伸阅读:【SOAP-WebService系列】使用WSDL生成SOAP-WebService客户端代码,使用IDEA开发SOAP-WebService示例
-
UDDI(Universal Description, Discovery, and Integration):即统一描述、发现和集成 。是一种用于描述、发现、集成Web Service的目录服务,最初是一个项目、计划、运动。2000年IBM、微软等公司提出UDDI项目,并创建了公共UDDI站点(微软的是https://uddi.microsoft.com/),但是这些站点在2006年时就已经关闭了。
延伸阅读:
【SOAP-WebService系列】历史产物UDDI是什么、长什么样,以及UDDI的发展历程
【SOAP-WebService系列】Windows Server安装UDDI以及使用
为帮助理解他们之间的工作流程,结合起来描述:
SOAP-WebService是一种跨语言、跨平台的web服务远程调用技术,它使用SOAP协议进行通信。一次SOAP-WebService的调用,就是一次SOAP协议的通信。SOAP是独立的并可通过WSDL进行自我描述。WSDL文档类似目前常用的RESTful API接口文档,里面定义了某个SOAPful WebServices提供的接口和相关的参数信息,通过WSDL生成接口调用代码。SOAPful WebServices可以使用UDDI来发现,UDDI是一个SOAPful WebServices注册中心,通过它可以搜索需要的服务以及服务的WSDL地址
[附]Java中的WebServices开发规范
Java中共有三个WebService规范,分别是JAX-WS(JAX-RPC)、JAX-RS、JAXM&SAAJ(废弃)
(JAX-RS是RESTful WebServices规范,其他两个是SOAPful WebService规范)
"JA"的全拼是JavaAPI,这三个规范其实是Java API工具包。他们提供了一些注解,大大简化了开发流程。
Apache提供的CXF框架对JAX-WS和JAX-RS进行了封装,是以前最流行的WebService开发框架。
其中JAX-WS是最经典最传统的规范,符合SOAP-WebService技术三要素
在百度文库-JavaEE的发展历史 找到了它们的发布时间,这能帮助我们了解历史
JAX-RPC:2001-08-22,跟随JavaEE1.3发布
JAX-WS2.0(JAX-RPC2.0):2006-05-08,跟随JavaEE5发布
JAX-RS:2009-12-10,跟随JavaEE6发布
下面分别介绍这三个规范
JAX-WS(JAX-RPC)
(全拼:Java API for XML-Based WebServices)
在JavaEE5中,JAX-RPC 2.0
更名为JAX-WS 2.0
,名称的变更反映了从RPC-style到document-style的Web服务的变迁
- 采用标准SOAP(Simple Object Access Protocol) 协议传输,soap属于w3c标准。Soap协议是基于http的应用层协议,soap协议传输是xml数据。
- 采用wsdl作为描述语言即soapful webservices使用说明书,wsdl属w3c标准。
- xml是soap-webservice的跨平台的基础,XML主要的优点在于它既与平台无关,又与厂商无关。
- XSD,W3C为soap-webservice制定了一套传输数据类型,使用xml进行描述,即XSD(XML Schema Datatypes),任何编程语言写的soapful webservices接口在发送数据时都要转换成标准的XSD发送。
JAXM&SAAJ(废弃)
(全拼:JAVA API For XML Message)
JAXM主要定义了包含了发送和接收消息所需的API,SAAJ(SOAP With Attachment APIFor Java,JSR 67)是与JAXM 搭配使用的API,为构建SOAP 包和解析SOAP 包提供了重要的支持,支持附件传输等,JAXM&SAAJ 与JAX-WS 都是基于SOAP 的Web 服务,相比之下JAXM&SAAJ 暴漏了SOAP更多的底层细节,编码比较麻烦,而JAX-WS 更加抽象,隐藏了更多的细节,更加面向对象,实现起来你基本上不需要关心SOAP 的任何细节
JAX-RS
(全拼:Java API for RESTful Web Services)
JAX-RS是在Roy Fielding(REST提出者)的参与下,针对REST风格制定的一套WebServices-API。推出的较晚,随JavaEE6发布。REST-WebService不采用SOAP传输,而是直接使用HTTP传输,可以返回xml或json,比较轻量
支持JAX-RS服务规范的框架有:
- CXF——XFire和Celtix的合并(一个由IONA赞助的开源ESB,最初寄存在ObjectWeb上)。
- Jersey——Sun公司的JAX-RS参考实现。
- RESTEasy——JBoss的JAX-RS项目。
- Restlet——也许是最早的REST框架了,它JAX-RS之前就有了。
讨论:"WebService(s)=SOAP-WebService"的历史包袱是如何造成的?
①SOAP-WebService出现时没起名字,并且被软件巨头们大力推广。这是根本原因
2000年左右提出的web服务概念,使互联网进入了井喷式的发展
简述分布式的定义、分类、技术发展历史进程:SOA时代 (分布式网络架构)
在这个历史性节点,各大互联网企业争先创造成绩。SOAP-WebService就是一套用来构建Web服务(WebServices)的方案
SOAP-WebService由软件巨头IBM、Microsoft等提出,它的三要素: SOAP、WSDL、UDDI,也是这几个公司搞出来的
在当时看来,巨头们或是为了尽快推动WebServices的发展,亦或是认定了WebServices就是要这么实现,所以没有给这套SOAP-WebService技术起名字,直接就叫它WebService(s)。然后将这套SOAP-WebService技术进行大力推广,造成"WebService(s)=SOAP-WebService"的潜意识。
SOAP-WebService和SOA相辅相成,互联网迅速丰富了起来。尽管后来SOAP-WebService被REST取代,但对"WebService(s)"这一词的解释,并没有在互联网信息中进行及时地更新,"WebService(s)=SOAP-WebService"的意识已经深入人心。
②WebServices(Web服务)的含义比较简单易懂,不需要很多资料去做解释;大量的WebService(s)资料都是在解释SOAP-WebService,促进了这个包袱的产生
————
“WebService"在英文搜索结果中也大多都是指SOAP-WebService,因为技术的传递还是比较谨慎的,所以传到中国也还是叫"WebService”
但对于初学者来说,“WebService"会被大脑自动翻译为"Web服务、网络服务”,认为是一种人们日常使用到的一种互联网概念,所以带着自己先入为主的理解,再去看"WebService"的搜索结果时,就会被搜索到的"SOAP-WebService"搞迷糊。慢慢看到类似于本文一样来进行正确解读的文章或文段,恍然大悟,也就发现了这个"历史包袱"
二、RESTful WebServices
RESTful WebServices 是在SOAPful WebServices之后一直到现在都最流行的一种WebServices的形态,它使用"REST架构风格"构建/实现
REST出自Roy Fielding的博士论文,是一个 “为分布式超媒体系统设计的REST架构风格”
SOAPful WebServices 是面向消息,它本质上是一个RPC风格的web服务,他认为web服务就是一组消息的交互。
而 REST 的核心是 将信息抽象为资源,所有web组件的交互都是对资源的操作,它引导开发者将信息"资源化"。
在实践中,RESTful WebServices最大的特点是:每个资源都有一个长期固定不变的url,web各组件使用HTTP自带的语义进行资源的操作(或者说 服务的调用)
其实REST本身并不仅仅应用于web服务,它是为所有分布式超媒体系统设计的一种架构风格。REST指导web架构应当如何设计(面向资源的设计)、如何提高服务器的伸缩性、提升服务器各组件的进化能力、组件之间如何应用设计统一的API等等
REST架构风格能够指导构建一个优秀的web服务,所以才有了 RESTful WebServices 概念。
但需要区分清楚的一点是,RESTful WebServices并不是REST的全部,这个名词只是将REST用于web服务的叫法。
(很多人并没有搞清楚这一点,因为REST是抽象的,而web服务技术是具象的)
REST是一个需要大篇幅描述的东西,所以新整理一篇:【REST系列】详解REST和RESTful
REST是如今主流的web架构指导思想,值得大家花时间深入了解它
REST vs SOAP-WebService
感兴趣的同学可以在这篇文章中详细了解:【WebServices系列】REST和SOAP之争
另外,我对SOAP、UDDI的退出也进行了比较具体的分析。不在本文赘述,链接如下
分析SOAP的退出:【WebServices系列】REST和SOAP之争
分析UDDI的退出:【WebService系列】历史产物UDDI是什么、长什么样,以及UDDI的发展历程 中:UDDI为何昙花一现?(为何失败、缺点分析)
WSDL的退出:WSDL是用来描述SOAP的,会随着SOAP一起兴衰,所以不需要进行分析
[附] Java web开发框架:Spring和CXF的发展和取代
Apache CXF是一个典型的WebService开发框架,但现在已经被淘汰了。
Apache CXF封装了JAX-WS,以方便进行SOAP-WebService的开发,包括SOAPful WebServices的发布和调用。后来也封装了JAX-RS以支持RESTful WebServices
Spring是一个Web应用开发框架,它具备完善的MVC架构,极大简化了web应用的开发流程。
Web应用和Web服务的区别:Web服务只是Web应用的其中一个功能,Web应用开发起码包括MVC三个层面,而Web服务只是web应用对外的一个功能。
Spring1.0版本发布于2004年3月。从Spring官方文档(Spring Web Services Reference Documentation)中看到,它也有一个支持JAX-WS的框架:Spring-WS。但或许是因为出现的比较晚,用的人不多,资料也较少。
网上有很多提到"将CXF整合到Spring",这种做法的目的是,将Spring作为Web应用开发的主框架,将CXF作为发布和调用SOAPful WebServices的功能框架
后来SOAP-WebService被淘汰,Spring本身也整合了REST,用很多注解支持了RESTful API (Spring Boot Rest常用注解简介),Apache CXF就被淘汰掉了
就到这里