webservice之入门二

WSDL介绍web

        介绍过了soap,下面再看看wsdl的介绍。
函数

下面是wsdl的主要文档元素:编码



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

WSDL文档的结构实例解析code

  下面咱们将经过一个实际的WSDL文档例子来详细说明各标签的做用及关系。orm

<?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这个前缀指向自身的命名空间。element

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"属性区分。


        以上的内容是介绍了webservice的构成结构以及结构的概念,理解了这些概念后,咱们带着这些理解去编写一些代码,让咱们用代码(另外一个女友)来和咱们的理解一一应证!(代码虐我千百遍,我待代码如初恋!)

相关文章
相关标签/搜索