zoukankan      html  css  js  c++  java
  • 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规范了体系中的各种关键技术,包括服务描述、发布、发现以及消息传输等,参考模型如图所示。

    其中最重要的三要素如下:

    • WSDL: 用来描述如何访问具体的服务。
    • SOAP: 基于HTTP协议,采用XML格式,用来传递信息的格式。
    • 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.1 WSDL文档中主要元素:

    抽象定义

    • Types:定义Web服务使用的所有数据类型集合,可被元素的各消息部件所引用。
    • Messages:通信消息数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构,包括函数参数或文档描述。
    • PortTypes:引用消息部分中消息定义来描述函数签名(操作名、输入参数、输出参数)。

    具体定义

    • Operation:对服务中操作的抽象描述。一个Operation描述了一个访问入口的请求/响应消息对。
    • Bindings:portType部分的操作在此绑定实现,包含了如何将抽象接口的元素转变为具体表示的细节。
    • Port:定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。
    • Services:确定每个绑定的端口地址。

    portType、message和type描述了Web服务是什么,binding描述了如何使用Web服务,port和service描述了Web服务的位置。

    2.1.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节点描述了参数及返回值的数据类型。

    2.2 SOAP(通讯协议)

    SOAP(Simple Object Access Protocol/简单文件传输协议)是一个轻量的、简单的、基于XML的协议。使用http发送的XML格式的数据,它可以跨平台,跨防火墙,SOAP不是webservice的专有协议。

    2.2.1 SOAP包括四个部分:

    • SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架。
    • SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例。
    • SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定。
    • SOAP绑定(binding),使用底层协议交换信息。

    2.2.2 SOAP的基本结构包含以下元素:

    • Envelope(必须)标识文档为SOAP消息,是SOAP的根元素。
    • Header(可选)包含头部信息,如果SOAP消息有Header,则Header必须是Envelope的第一个子元素。
    • Body(必须)包含所有的调用和响应信息。
    • Fault(可选)提供错误消息。

    2.2.3 SOAP1.1 & SOAP1.2 协议

    目前WebService的协议主要有SOAP1.1和1.2,下面通过查看两者请求及响应来分析两者区别:

    2.2.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>

    2.2.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>

    2.2.3.3 两者区别

    相同之处:

    • soap1.1soap1.2都是使用post方法
    • 都包括EnvelopeBody

    不同之处:

     内容类型context-type不同:

    • soap1.1使用text/xml
    • soap1.2使用application/soap+xml

       命名空间Envelope xmlns不同:

    2.3 UDDI

    UDDI(Universal Description, Discovery and Integration/通用描述、发现和集成)主要提供基于Web服务的注册和发现机制,为Web服务提供三个重要的技术支持:

    • 标准、透明、专门描述Web服务的机制。
    • 调用Web服务的机制。
    • 可以访问的Web服务注册中心。

    但是使用webservice并不是必须使用UDDI,因为用户通过WSDL知道了web service的地址,可以直接通过WSDL调用webservice。

  • 相关阅读:
    利用“Java同包同名类执行顺序”取消Java 网站应用程序Licence验证
    “Nested exception: 前言中不允许有内容"错误处理
    服务器日志文件Web远程查看
    Sql Server性能定位及改善
    eHR自动同步获取LDAP中的邮箱地址
    SQL Server中调用WebService
    大数据自学6-Hue集成环境操作Hbase
    大数据自学5-Python操作Hbase
    大数据自学4-Hue集成环境中各模组说明
    大数据自学3-Windows客户端DbVisualizer/SQuirreL配置连接hive
  • 原文地址:https://www.cnblogs.com/zjfjava/p/9000577.html
Copyright © 2011-2022 走看看