这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战
接 【WebServices系列】详解WebServices (SOAP-WebService & REST) (上)
二、SOAP-WebService:一个最早用于实现/构建WebServices的基于SOAP的技术
==这是一个最早用于实现/构建WebServices的基于SOAP的技术,占据了搜索"WebService"最大的结果比重,从这种实际现象来看,"WebService"专指基于SOAP的构建WebServices的技术,这就是历史包袱==
为了摆脱历史包袱,我们用"SOAP-WebService"表示这个技术,用"SOAP-WebServices"表示基于这个技术构建的"WebServices"。因为SOAP是基于XML的,所以在一些资料中也将称其为"XML-WebService(s)"
"SOAP"、"XML"是一个状语,用来修饰"WebService(s)",实际上除了技术的严谨性以外,还有一个原因让我们加上这个状语
与SOAP-WebService(s)相对的是REST-WebService(s)
在实际现象中:
"SOAP-WebService(s)":没多少人会加上SOAP,就叫WebService(s)。(历史包袱) "REST-WebService(s)":也没人会加上WebService(s),就叫REST。 明白这个现象,对摆脱历史包袱是很重要的 稍后会对REST做详解
SOAP是一个通信协议,SOAP-WebService ==本质上是一个RPC== ,是一套SOAP-WebServices之间的通信传输技术标准
SOAP-WebService估计很多人都没有用过,文字资料不是很直观,推荐看一些视频,能快速了解其基本概念和开发流程: 推荐看 java进阶教程之webservice深入浅出【黑马程序员】 这个视频两个小时,可以快速过一遍。唯一的缺点是没有用wsdl来生成代码(而是客户端代码直接copy了服务端的服务接口代码),使用wsdl生成代码可以看:WebService全套实战教程(12)【2019千锋Java】
- 使用 wsimport 生成代码:P3 (03_第二种调用服务的方式&服务升级的处理)
- 使用 wsdl2java 生成代码:P12 (12_CXF发布服务和访问服务)
SOAP-WebService,是早期软件巨头IBM、Microsoft等 定义的"用来构建WebServices的技术/技术栈/标准/规范"(这个"WebServices"在现在看来实际上是"SOAP-WebServices"),以SOAP、WSDL、UDDI为三核心:
-
SOAP(Simple Object Access Protocol): 即简单对象访问协议。它是一个基于XML的通信协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定。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站点(微软的是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接口文档,里面定义了某个SOAP-WebServices提供的接口和相关的参数信息,通过WSDL生成接口调用代码。SOAP-WebServices可以使用UDDI来发现,UDDI是一个SOAP-WebServices注册中心,通过它可以搜索需要的服务以及服务的WSDL地址
附:Java中的WebServices开发规范
Java中共有三个WebService规范,分别是JAX-WS(JAX-RPC)、JAX-RS、JAXM&SAAJ(废弃)
(JAX-RS是REST-WebService规范,其他两个是SOAP-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作为描述语言即soap-webservices使用说明书,wsdl属w3c标准。
- xml是soap-webservice的跨平台的基础,XML主要的优点在于它既与平台无关,又与厂商无关。
- XSD,W3C为soap-webservice制定了一套传输数据类型,使用xml进行描述,即XSD(XML Schema Datatypes),任何编程语言写的soap-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之前就有了。
明天继续