Web Service基础——规范及三要素

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节点。

  1. 先找Service节点
  2. Service节点中找port节点。每个port对应一个PortType。
  3. Port节点对应一binding节点。每个binding节点对应一个PortType
  4. PortType中有operation 节点就是服务的方法。
  5. operation 中有Input(参数)和output(返回值)
  6. Input(参数)和output(返回值)对应message节点
  7. 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.1soap1.2都是使用post方法
  • 都包括Envelopebody

不同之处:

 内容类型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。

猜你喜欢

转载自www.cnblogs.com/zjfjava/p/9000577.html