zoukankan      html  css  js  c++  java
  • wsdl

    绍过了SOAP,让我们关注Web Service中另外一个重要的组成WSDL。
    WSDL的主要文档元素

    WSDL文档可以分为两部分。顶部分由抽象定义组成,而底部分则由具体描述组成。抽象部分以独立于平台和语言的方式定义SOAP消息,它们并不包含任何随机器或语言而变的元素。这就定义了一系列服务,截然不同的应用都可以实现。具体部分,如数据的序列化则归入底部分,因为它包含具体的定义。在上述的文档元素中,<types>、<message>、<portType>属于抽象定义层,<binding>、<service>属于具体定义层。所有的抽象可以是单独存在于别的文件中,也可以从主文档中导入。

    WSDL文档的结构实例解析
    下面我们将通过一个实际的WSDL文档例子来详细说明各标签的作用及关系。
    <?xml version="1.0" encoding="UTF-8"?>
    <definitions
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:tns="http://www.jsoso.com/wstest"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    targetNamespace="http://www.jsoso.com/wstest"
    name="Example">
    <types>
    <xsd:schema>
    <xsd:import
    namespace="http://www.jsoso.com/wstest"
    schemaLocation="http://localhost:8080/hello?xsd=1"></xsd:import>
    </xsd:schema>
    </types>
    <message name="toSayHello">
    <part name="userName" type="xsd:string"></part>
    </message>
    <message name="toSayHelloResponse">
    <part name="returnWord" type="xsd:string"></part>
    </message>
    <message name="sayHello">
    <part name="person" type="tns:person"></part>
    <part name="arg1" type="xsd:string"></part>
    </message>
    <message name="sayHelloResponse">
    <part name="personList" type="tns:personArray"></part>
    </message>
    <message name="HelloException">
    <part name="fault" element="tns:HelloException"></part>
    </message>
    <portType name="Example">
    <operation name="toSayHello" parameterOrder="userName">
    <input message="tns:toSayHello"></input>
    <output message="tns:toSayHelloResponse"></output>
    </operation>
    <operation name="sayHello" parameterOrder="person arg1">
    <input message="tns:sayHello"></input>
    <output message="tns:sayHelloResponse"></output>
    <fault message="tns:HelloException" name="HelloException"></fault>
    </operation>
    </portType>
    <binding name="ExamplePortBinding" type="tns:Example">
    <soap:binding
    transport="http://schemas.xmlsoap.org/soap/http"
    style="rpc"></soap:binding>
    <operation name="toSayHello">
    <soap:operation soapAction="sayHello"></soap:operation>
    <input>
    <soap:body use="literal"
    namespace="http://www.jsoso.com/wstest"></soap:body>
    </input>
    <output>
    <soap:body use="literal"
    namespace="http://www.jsoso.com/wstest"></soap:body>
    </output>
    </operation>
    <operation name="sayHello">
    <soap:operation soapAction="sayHello"></soap:operation>
    <input>
    <soap:body use="literal"
    namespace="http://www.jsoso.com/wstest"></soap:body>
    </input>
    <output>
    <soap:body use="literal"
    namespace="http://www.jsoso.com/wstest"></soap:body>
    </output>
    <fault name="HelloException">
    <soap:fault name="HelloException" use="literal"></soap:fault>
    </fault>
    </operation>
    </binding>
    <service name="Example">
    <port name="ExamplePort" binding="tns:ExamplePortBinding">
    <soap:address location="http://localhost:8080/hello"></soap:address>
    </port>
    </service>
    </definitions>

    由于上面的事例XML较长,我们将其逐段分解讲解

    WSDL文档的根元素:<definitions>
    <definitions
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:tns="http://www.jsoso.com/wstest"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    targetNamespace="http://www.jsoso.com/wstest"
    name="Example">
    ……
    ……
    </definitions>

    <definitions>定义了文档中用到的各个xml元素的namespace缩写,也界定了本文档自己的targetNamespace="http://www.jsoso.com/wstest",这意味着其它的XML要引用当前XML中的元素时,要声明这个namespace。注意xmlns:tns="http://www.jsoso.com/wstest"这个声明,它标示了使用tns这个前缀指向自身的命名空间。

    引用
    WSDL文档数据类型定义元素:<types>

    <types>
    <xsd:schema>
    <xsd:import
    namespace="http://www.jsoso.com/wstest"
    schemaLocation="http://localhost:8080/hello?xsd=1"></xsd:import>
    </xsd:schema>
    </types>

    <types>标签定义了当前的WSDL文档用到的数据类型。要说明的是,为了最大程度的平台中立性,WSDL 使用 XML Schema 语法来定义数据类型。这些数据类型用来定义web service方法的参数和返回指。对于通用的原生数据类型如:integer , boolean , char , float等,在W3C的标准文档http://www.w3.org/2001/XMLSchema中已经做了定义。这里我们要引入的schema定义schemaLocation="http://localhost:8080/hello?xsd=1"是我们自定义的Java对象类型。

    WSDL文档消息体定义元素:< message >
    <message name="toSayHello">
    <part name="userName" type="xsd:string"></part>
    </message>
    <message name="toSayHelloResponse">
    <part name="returnWord" type="xsd:string"></part>
    </message>
    <message name="sayHello">
    <part name="person" type="tns:person"></part>
    <part name="arg1" type="xsd:string"></part>
    </message>
    <message name="sayHelloResponse">
    <part name="personList" type="tns:personArray"></part>
    </message>
    <message name="HelloException">
    <part name="fault" element="tns:HelloException"></part>
    </message>

    <message>元素定义了web service函数的参数。<message>元素中的每个<part>子元素都和某个参数相符。输入参数在<message>元素中定义,与输出参数相隔离,输出参数有自己的<message>元素。兼作输入、输出的参数在输入输出的<message>元素中有它们相应的<part>元素。输出<message>元素以"Response"结尾,对Java而言方法得返回值就对应一个输出的<message>。每个<part>元素都有名字和类型属性,就像函数的参数有参数名和参数类型。

    在上面的文档中有两个输入参数、两个输出参数和一个错误参数(对应Java中的Exception)。

     输入参数<message>的name属性分别命名为toSayHello,sayHello。
    toSayHello对应输入参数userName,参数类型为xsd:string,在Java语言中就是String;
    sayHello对应两个输入参数person和arg1,类型为tns:person和xsd:string。这里tns:person类型就是引用了< types >标签中的类型定义。

     输出参数<message>的name属性分别命名为toSayHelloResponse和sayHelloResponse。
    这个名称和输入参数的<message>标签name属性对应,在其后面加上Response尾缀。
    toSayHelloResponse对应的返回值是returnWord,参数类型为xsd:string;
    sayHelloResponse对应的返回值是personList,参数类型为tns:personArray(自定义类型);

     错误参数<message>的name属性为HelloException。
    它的<part>子标签element而不是type来定义类型。

    以上的message标签的name属性通常使用web service函数方法名作为参照,错误参数标签则使用异常类名为参照。标签中的参数名称,即part子元素的name属性是可自定义的(下一章节详细说明)。message标签的参数类型将引用types标签的定义。

    WSDL文档函数体定义元素:< portType >
    <portType name="Example">
    <operation name="toSayHello" parameterOrder="userName">
    <input message="tns:toSayHello"></input>
    <output message="tns:toSayHelloResponse"></output>
    </operation>
    <operation name="sayHello" parameterOrder="person arg1">
    <input message="tns:sayHello"></input>
    <output message="tns:sayHelloResponse"></output>
    <fault message="tns:HelloException" name="HelloException"></fault>
    </operation>
    </portType>

    <portType> 元素是最重要的 WSDL 元素。它可描述一个 web service、可被执行的操作,以及相关的消息。portType的name属性对应Java中的一个服务类的类名。<portType> 元素使用其子元素< operation>描述一个web service的服务方法。

    在<operation>元素中,name属性表示服务方法名,parameterOrder属性表示方法的参数顺序,使用空格符分割多个参数,如:“parameterOrder="person arg1”。<operation>元素的子标签<input>表示输入参数说明,它引用<message>标签中的输入参数。<output>表示输出参数说明,它引用<message>标签中的输出参数。<fault>标签在Java方法中的特别用来表示异常(其它语言有对应的错误处理机制),它引用<message>标签中的错误参数。

    WSDL绑定实现定义元素:< binding >
    <binding name="ExamplePortBinding" type="tns:Example">
    <soap:binding
    transport="http://schemas.xmlsoap.org/soap/http"
    style="rpc"></soap:binding>
    <operation name="toSayHello">
    <soap:operation soapAction="sayHello"></soap:operation>
    <input>
    <soap:body use="literal"
    namespace="http://www.jsoso.com/wstest"></soap:body>
    </input>
    <output>
    <soap:body use="literal"
    namespace="http://www.jsoso.com/wstest"></soap:body>
    </output>
    </operation>
    <operation name="sayHello">
    <soap:operation soapAction="sayHello"></soap:operation>
    <input>
    <soap:body use="literal"
    namespace="http://www.jsoso.com/wstest"></soap:body>
    </input>
    <output>
    <soap:body use="literal"
    namespace="http://www.jsoso.com/wstest"></soap:body>
    </output>
    <fault name="HelloException">
    <soap:fault name="HelloException" use="literal"></soap:fault>
    </fault>
    </operation>
    </binding>

    <binding>标签是完整描述协议、序列化和编码的地方,<types>,<message>和<portType>标签处理抽象的数据内容,而<binding>标签是处理数据传输的物理实现。
    <binding>标签把前三部分的抽象定义具体化。

    首先<binding>标签使用<soap:binding>的transport和style属性定义了Web Service的通讯协议HTTP和SOAP的请求风格RPC。其次<operation>子标签将portType中定义的operation同SOAP的请求绑定,定义了操作名称soapAction,输出输入参数和异常的编码方式及命名空间。

    WSDL服务地址绑定元素:< service >
    <service name="Example">
    <port name="ExamplePort" binding="tns:ExamplePortBinding">
    <soap:address location="http://localhost:8080/hello"></soap:address>
    </port>
    </service>

    service是一套<port>元素。在一一对应形式下,每个<port>元素都和一个location关联。如果同一个<binding>有多个<port>元素与之关联,可以使用额外的URL地址作为替换。

    一个WSDL文档中可以有多个<service>元素,而且多个<service>元素十分有用,其中之一就是可以根据目标URL来组织端口。在一个WSDL文档中,<service>的name属性用来区分不同的service。在同一个service中,不同端口,使用端口的"name"属性区分。

    这一章节,我们简单的描述了WSDL对SOAP协议的支持,以及在Web Service中的作用。在接下来的章节中,我们将学习如何使用Java6.0的Annotation标签来定义和生成对应的WSDL。
  • 相关阅读:
    GitLab 介绍
    git 标签
    git 分支
    git 仓库 撤销提交 git reset and 查看本地历史操作 git reflog
    git 仓库 回退功能 git checkout
    python 并发编程 多进程 练习题
    git 命令 查看历史提交 git log
    git 命令 git diff 查看 Git 区域文件的具体改动
    POJ 2608
    POJ 2610
  • 原文地址:https://www.cnblogs.com/lee/p/1246448.html
Copyright © 2011-2022 走看看