1. Java中的Web Service规范
Java 中共有三种WebService 规范,分别是JAX-WS(JAX-RPC)、JAX-RS、JAXM&SAAJ(废弃)。
1.1 JAX-WS规范
JAX-WS 的全称为Java API for XML-Based Webservices ,早期的基于SOAP 的JAVA 的Web 服务规范JAX-RPC(Java API For XML-Remote Procedure Call)目前已经被JAX-WS 规范取代。从java5开始支持JAX-WS2.0版本,Jdk1.6.0_13以后的版本支持2.1版本,jdk1.7支持2.2版本。
- 采用标准SOAP(Simple Object Access Protocol) 协议传输,soap属于w3c标准。Soap协议是基于http的应用层协议,soap协议传输是xml数据。
- 采用wsdl作为描述语言即webservice使用说明书,wsdl属w3c标准。
- xml是webservice的跨平台的基础,XML主要的优点在于它既与平台无关,又与厂商无关。
- XSD,W3C为webservice制定了一套传输数据类型,使用xml进行描述,即XSD(XML Schema Datatypes),任何编程语言写的webservice接口在发送数据时都要转换成webservice标准的XSD发送。
1.2 JAX-RS规范
JAX-RS 是JAVA 针对REST(Representation State Transfer)风格制定的一套Web 服务规范,由于推出的较晚,该规范(JSR 311,目前JAX-RS 的版本为1.0)并未随JDK1.6 一起发行。
支持JAX-RS服务规范的框架有:
- CXF——XFire和Celtix的合并(一个由IONA赞助的开源ESB,最初寄存在ObjectWeb上)。
- Jersey——Sun公司的JAX-RS参考实现。
- RESTEasy——JBoss的JAX-RS项目。
- Restlet——也许是最早的REST框架了,它JAX-RS之前就有了。
注:REST 是一种软件架构模式,只是一种风格,rest服务采用HTTP 做传输协议。
2. Web Service三要素(基于JAX-WS规范)
Web Service规范了体系中的各种关键技术,包括服务描述、发布、发现以及消息传输等,参考模型如图所示。
其中最重要的三要素如下:
- SOAP: 基于HTTP协议,采用XML格式,用来传递信息的格式。
- WSDL: 用来描述如何访问具体的服务。
- UDDI: 用户自己可以按UDDI标准搭建UDDI服务器,用来管理,分发,查询WebService 。其他用户可以自己注册发布WebService调用。
2.1 WSDL
WSDL(Web Service Description Language/Web服务描述语言)是用XML文档来描述Web服务的标准,通过WSDL可描述Web服务的三个基本属性:
- 服务能做什么(服务所提供的操作/方法)
- 如何访问服务(和服务交互的数据格式以及协议)
- 服务位于何处(与协议相关的服务地址,如URL)
WSDL文档以端口集合的形式来描述Web服务,WSDL服务描述包含对一组操作和消息的一个抽象定义、绑定到这些操作和消息的一个具体协议、以及一个网络端点规范。WSDL文档被分为服务接口(Service Interface/抽象)定义和服务实现(Service Implementation/具体实现)定义,WSDL基本结构如图所示。
2.1 WSDL文档中主要元素:
抽象定义
- Types:定义Web服务使用的所有数据类型集合,可被元素的各消息部件所引用。
- Messages:通信消息数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构,包括函数参数或文档描述。
- PortTypes:引用消息部分中消息定义来描述函数签名(操作名、输入参数、输出参数)。
具体定义
- Operation:对服务中操作的抽象描述。一个Operation描述了一个访问入口的请求/响应消息对。
- Bindings:portType部分的操作在此绑定实现,包含了如何将抽象接口的元素转变为具体表示的细节。
- Port:定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。
- Services:确定每个绑定的端口地址。
portType、message和type描述了Web服务是什么,binding描述了如何使用Web服务,port和service描述了Web服务的位置。
2.2 WSDL阅读方法
是从下往上读,每个wsdl有且只有一个Service节点。
- 先找Service节点
- Service节点中找port节点。每个port对应一个PortType。
- Port节点对应一binding节点。每个binding节点对应一个PortType
- PortType中有operation 节点就是服务的方法。
- operation 中有Input(参数)和output(返回值)
- Input(参数)和output(返回值)对应message节点
- Message对应element节点。Element节点对应complexType节点描述了参数及返回值的数据类型。
3. SOAP(通讯协议)
SOAP(Simple Object Access Protocol/简单文件传输协议)是一个轻量的、简单的、基于XML的协议。使用http发送的XML格式的数据,它可以跨平台,跨防火墙,SOAP不是webservice的专有协议。
3.1 SOAP包括四个部分:
- SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架。
- SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例。
- SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定。
- SOAP绑定(binding),使用底层协议交换信息。
3.2 SOAP的基本结构包含以下元素:
- Envelope(必须)标识文档为SOAP消息,是SOAP的根元素。
- Header(可选)包含头部信息,如果SOAP消息有Header,则Header必须是Envelope的第一个子元素。
- Body(必须)包含所有的调用和响应信息。
- Fault(可选)提供错误消息。
3.3 SOAP1.1 & SOAP1.2 协议
目前WebService的协议主要有SOAP1.1和1.2,下面通过查看两者请求及响应来分析两者区别:
3.3.1 SOAP1.1
请求的协议体
POST /weather HTTP/1.1 Accept: text/xml, multipart/related Content-Type:text/xml; charset=utf-8 SOAPAction:"http://ws.jaxws.ws.itcast.cn/WeatherInterfaceImpl/queryWeatherRequest" User-Agent: JAX-WS RI 2.2.4-b01 Host: 127.0.0.1:54321 Connection:keep-alive Content-Length: 214 <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:queryWeather xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"> <arg0>北京</arg0> </ns2:queryWeather> </S:Body> </S:Envelope>
响应的协议体
HTTP/1.1 200 OK Transfer-encoding: chunked Content-type: text/xml; charset=utf-8 Date: Thu, 26 Nov 2015 03:14:29 GMT <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:queryWeatherResponse xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"> <return>晴转多云</return> </ns2:queryWeatherResponse> </S:Body> </S:Envelope>
3.3.2 SOAP1.2
JAX-WS不支持SOAP1.2服务端发布,直接发布会报如下异常
如果要发布SOAP1.2服务端,需要引入2.2.8及以上版本的jax-ws包(jaxws-ri-2.2.8);且在SEI实现类上添加如下注解
@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
请求的协议体
POST /weather HTTP/1.1 Accept: application/soap+xml, multipart/related Content-Type: application/soap+xml; charset=utf-8; action="http://ws.jaxws.ws.itcast.cn/WeatherInterfaceImpl/queryWeatherRequest" User-Agent: JAX-WS RI 2.2.4-b01 Host: 127.0.0.1:54321 Connection: keep-alive Content-Length: 212 <?xml version="1.0" ?> <S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope"> <S:Body> <ns2:queryWeather xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"> <arg0>北京</arg0> </ns2:queryWeather> </S:Body> </S:Envelope>
响应的协议体
HTTP/1.1 200 OK Transfer-encoding: chunked Content-type: application/soap+xml; charset=utf-8 Date: Thu, 26 Nov 2015 03:25:24 GMT <?xml version='1.0' encoding='UTF-8'?> <S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope"> <S:Body> <ns2:queryWeatherResponse xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"> <return>晴转多云</return> </ns2:queryWeatherResponse> </S:Body> </S:Envelope>
3.3.3 两者区别
相同之处:
- soap1.1和soap1.2都是使用post方法
- 都包括Envelope和body
不同之处:
内容类型context-type不同:
- soap1.1使用text/xml
- soap1.2使用application/soap+xml
命名空间Envelope xmlns不同:
4. UDDI
UDDI(Universal Description, Discovery and Integration/通用描述、发现和集成)主要提供基于Web服务的注册和发现机制,为Web服务提供三个重要的技术支持:
- 标准、透明、专门描述Web服务的机制。
- 调用Web服务的机制。
- 可以访问的Web服务注册中心。
但是使用webservice并不是必须使用UDDI,因为用户通过WSDL知道了web service的地址,可以直接通过WSDL调用webservice。