`

Web Service概述一 (转载)

阅读更多

Web Service概述

原文地址:http://blog.csdn.net/qjyong/archive/2008/03/05/2148558.aspx

Web Service的定义
W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计。Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执行远程系统的请求服务。

这 里我们从一个程序员的视角来观察web service。在传统的程序编码中,存在这各种的函数方法调用。通常,我们知道一个程序模块M中的方法A,向其发出调用请求,并传入A方法需要的参数 P,方法A执行完毕后,返回处理结果R。这种函数或方法调用通常发生在同一台机器上的同一程序语言环境下。现在的我们需要一种能够在不同计算机间的不同语 言编写的应用程序系统中,通过网络通讯实现函数和方法调用的能力,而Web service正是应这种需求而诞生的。

最普遍的一种说法 就是,Web Service = SOAP + HTTP + WSDL。其中,SOAP Simple Object Access Protocol)协议是web service的主体,它通过HTTP或者SMTP等应用层协议进行通讯,自身使用XML文件来描述程序的函数方法和参数信息,从而完成不同主机的异构系 统间的计算服务处理。这里的WSDL(Web Services Description Language)web 服务描述语言也是一个XML文档,它通过HTTP向公众发布,公告客户端程序关于某个具体的 Web service服务的URL信息、方法的命名,参数,返回值等。
下面,我们先来熟悉一下SOAP协议,看看它是如何描述程序中的函数方法、参数及结果对象的。

SOAP协议简介

什么是SOAP
SOAP 指简单对象访问协议,它是一种基于XML的消息通讯格式,用于网络上,不同平台,不同语言的应用程序间的通讯。可自定义,易于扩展。一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:
• Envelope 元素,标识XML 文档一条 SOAP 消息
• Header 元素,包含头部信息的XML标签
• Body 元素,包含所有的调用和响应的主体信息的标签
• Fault 元素,错误信息标签。

以上的元素都在 SOAP的命名空间http://www.w3.org/2001/12/soap-envelope中声明;
SOAP的语法规则
• SOAP 消息必须用 XML 来编码
• SOAP 消息必须使用 SOAP Envelope 命名空间
• SOAP 消息必须使用 SOAP Encoding 命名空间
• SOAP 消息不能包含 DTD 引用
• SOAP 消息不能包含 XML 处理指令

SOAP 消息的基本结构

Java代码
  1. <? xml version= "1.0" ?>   
  2. <soap:Envelope   
  3. xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"   
  4. soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >   
  5. <soap:Header>   
  6.   ...   
  7.   ...   
  8. </soap:Header>   
  9. <soap:Body>   
  10.   ...   
  11.   ...   
  12.   <soap:Fault>   
  13.     ...   
  14.     ...   
  15.   </soap:Fault>   
  16. </soap:Body>   
  17. </soap:Envelope>  
<? xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Header>
  ...
  ...
</soap:Header>
<soap:Body>
  ...
  ...
  <soap:Fault>
    ...
    ...
  </soap:Fault>
</soap:Body>
</soap:Envelope>



SOAP Envelope 元素
Envelope 元素是 SOAP 消息的根元素。它指明 XML 文档是一个SOAP 消息。它的属性 xmlns:soap的值必须是http://www.w3.org/2001/12/soap-envelope。
 encodingStyle 属性,语法:soap:encodingStyle="URI"
encodingStyle 属性用于定义文档中使用的数据类型。此属性可出现在任何 SOAP 元素中,并会被应用到元素的内容及元素的所有子元素上。

Java代码 复制代码
  1. <? xml version= "1.0" ?>   
  2. <soap:Envelope   
  3. xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"   
  4. soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >   
  5.   ...   
  6.   Message information goes here   
  7.   ...   
  8. </soap:Envelope>  
<? xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
  ...
  Message information goes here
  ...
</soap:Envelope>



SOAP Header 元素

  • actor 属性,语法soap:actor="URI"


通过沿着消息路径经过不同的端点,SOAP 消息可从某个发送者传播到某个接收者。并非 SOAP 消息的所有部分均打算传送到 SOAP 消息的最终端点,不过,另一个方面,也许打算传送给消息路径上的一个或多个端点。SOAP 的 actor 属性可被用于将 Header 元素寻址到一个特定的端点。

  • mustUnderstand 属性 ,语法soap:mustUnderstand="0|1"


SOAP 的 mustUnderstand 属性可用于标识标题项对于要对其进行处理的接收者来说是强制的还是可选的。假如您向 Header 元素的某个子元素添加了 "mustUnderstand="1",则要求处理此头部的接收者必须认可此元素。

Java代码
  1. <? xml version= "1.0" ?>   
  2. <soap:Envelope   
  3. xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"   
  4. soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >   
  5. <soap:Header>   
  6. <m:Trans   
  7. xmlns:m= "http://www.jsoso.net/transaction/"     
  8. soap:mustUnderstand= "1"     
  9. soap:actor="http: //www.w3schools.com/appml/ “  >234</m:Trans>   
  10. </soap:Header>   
  11. ...   
  12. ...   
  13. </soap:Envelope>  
<? xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Header>
<m:Trans
xmlns:m="http://www.jsoso.net/transaction/" 
soap:mustUnderstand="1" 
soap:actor="http://www.w3schools.com/appml/ “  >234</m:Trans>
</soap:Header>
...
...
</soap:Envelope>



SOAP Body 元素
必需的 SOAP Body 元素可包含打算传送到消息最终端点的实际 SOAP 消息。Body元素中既可以包含SOAP定义的命名空间中的元素,如Fault,也可以是用户的应用程序自定义的元素。以下是一个用户定义的请求:

Java代码
  1. <? xml version= "1.0" ?>   
  2. <soap:Envelope   
  3. xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"   
  4. soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >   
  5. <soap:Body>   
  6.    <m:GetPrice xmlns:m= "http://www.jsoso.net/prices" >   
  7.       <m:Item>Apples</m:Item>   
  8.    </m:GetPrice>   
  9. </soap:Body>   
  10. </soap:Envelope>  
<? xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body>
   <m:GetPrice xmlns:m="http://www.jsoso.net/prices">
      <m:Item>Apples</m:Item>
   </m:GetPrice>
</soap:Body>
</soap:Envelope>


上面的例子请求苹果的价格。请注意,上面的 m:GetPrice 和 Item 元素是应用程序专用的元素。它们并不是 SOAP 标准的一部分。而对应的 SOAP 响应应该类似这样:

Java代码
  1. <?xml version= "1.0" ?>   
  2. <soap:Envelope   
  3. xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"   
  4. soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >   
  5. <soap:Body>   
  6.    <m:GetPriceResponse xmlns:m= "http://www.jsoso.net/prices" >   
  7.       <m:Price> 1.90 </m:Price>   
  8.    </m:GetPriceResponse>   
  9. </soap:Body>   
  10. </soap:Envelope>  
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body>
   <m:GetPriceResponse xmlns:m="http://www.jsoso.net/prices">
      <m:Price>1.90</m:Price>
   </m:GetPriceResponse>
</soap:Body>
</soap:Envelope>



SOAP Fault 元素
Fault 元素表示 SOAP的错误消息。它必须是 Body 元素的子元素,且在一条 SOAP 消息中,Fault 元素只能出现一次。Fault 元素拥有下列子元素:

常用的SOAP Fault Codes


HTTP协议中的SOAP 实例
下面的例子中,一个 GetStockPrice 请求被发送到了服务器。此请求有一个 StockName 参数,而在响应中则会返回一个 Price 参数。此功能的命名空间被定义在此地址中: "http://www.jsoso.net/stock"

  • SOAP 请求:(注意HTTP的Head属性)

 

Java代码
  1. POST /InStock HTTP/ 1.1   
  2. Host: www.jsoso.net   
  3. Content-Type: application/soap+xml; charset=utf- 8   
  4. Content-Length: XXX   
  5.   
  6. <? xml version= "1.0" ?>   
  7. <soap:Envelope   
  8. xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"   
  9. soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >   
  10.   <soap:Body xmlns:m= "http://www.jsoso.net/stock" >   
  11.     <m:GetStockPrice>   
  12.       <m:StockName>IBM</m:StockName>   
  13.     </m:GetStockPrice>   
  14.   </soap:Body>     
  15. </soap:Envelope>  
POST /InStock HTTP/1.1
Host: www.jsoso.net
Content-Type: application/soap+xml; charset=utf-8
Content-Length: XXX

<? xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
  <soap:Body xmlns:m="http://www.jsoso.net/stock">
    <m:GetStockPrice>
      <m:StockName>IBM</m:StockName>
    </m:GetStockPrice>
  </soap:Body>  
</soap:Envelope>

 

  • SOAP 响应:(注意HTTP的Head属性)

 

Java代码
  1. HTTP/ 1.1   200  OK   
  2. Content-Type: application/soap+xml; charset=utf- 8   
  3. Content-Length: XXX   
  4.   
  5. <? xml version= "1.0" ?>   
  6. <soap:Envelope   
  7. xmlns:soap= "http://www.w3.org/2001/12/soap-envelope"   
  8. soap:encodingStyle= "http://www.w3.org/2001/12/soap-encoding" >   
  9.   <soap:Body xmlns:m= "http://www.jsoso.net/stock" >   
  10.     <m:GetStockPriceResponse>   
  11.       <m:Price> 34.5 </m:Price>   
  12.     </m:GetStockPriceResponse>   
  13.   </soap:Body>     
  14. </soap:Envelope>  
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: XXX

<? xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
  <soap:Body xmlns:m="http://www.jsoso.net/stock">
    <m:GetStockPriceResponse>
      <m:Price>34.5</m:Price>
    </m:GetStockPriceResponse>
  </soap:Body>  
</soap:Envelope>



HTTP协议中的SOAP RPC工作流程


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

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

WSDL文档的结构实例解析
下面我们将通过一个实际的WSDL文档例子来详细说明各标签的作用及关系。

Java代码
  1. <?xml version= "1.0"  encoding= "UTF-8" ?>   
  2. <definitions   
  3.  xmlns:soap= "http://schemas.xmlsoap.org/wsdl/soap/"   
  4.  xmlns:tns= "http://www.jsoso.com/wstest"   
  5.  xmlns:xsd= "http://www.w3.org/2001/XMLSchema"   
  6.  xmlns= "http://schemas.xmlsoap.org/wsdl/"   
  7.  targetNamespace= "http://www.jsoso.com/wstest"   
  8.  name= "Example" >   
  9.   
  10. <types>   
  11.   <xsd:schema>   
  12.   <xsd: import   
  13.    namespace= "http://www.jsoso.com/wstest"   
  14.    schemaLocation= "http://localhost:8080/hello?xsd=1" ></xsd: import >   
  15.   </xsd:schema>   
  16. </types>   
  17.   
  18. <message name= "toSayHello" >   
  19.   <part name= "userName"  type= "xsd:string" ></part>   
  20. </message>   
  21. <message name= "toSayHelloResponse" >   
  22.   <part name= "returnWord"  type= "xsd:string" ></part>   
  23. </message>   
  24.   
  25. <message name= "sayHello" >   
  26.   <part name= "person"  type= "tns:person" ></part>   
  27.   <part name= "arg1"  type= "xsd:string" ></part>   
  28. </message>   
  29. <message name= "sayHelloResponse" >   
  30.   <part name= "personList"  type= "tns:personArray" ></part>   
  31. </message>   
  32. <message name= "HelloException" >   
  33.   <part name= "fault"  element= "tns:HelloException" ></part>   
  34. </message>   
  35.   
  36. <portType name= "Example" >   
  37.   <operation name= "toSayHello"  parameterOrder= "userName" >   
  38.     <input message= "tns:toSayHello" ></input>   
  39.     <output message= "tns:toSayHelloResponse" ></output>   
  40.   </operation>   
  41.   <operation name= "sayHello"  parameterOrder= "person arg1" >   
  42.     <input message= "tns:sayHello" ></input>   
  43.     <output message= "tns:sayHelloResponse" ></output>   
  44.     <fault message= "tns:HelloException"  name= "HelloException" ></fault>   
  45.   </operation>   
  46. </portType>   
  47.   
  48. <binding name= "ExamplePortBinding"  type= "tns:Example" >   
  49.   <soap:binding   
  50.     transport= "http://schemas.xmlsoap.org/soap/http"     
  51.     style= "rpc" ></soap:binding>   
  52.   <operation name= "toSayHello" >   
  53.     <soap:operation soapAction= "sayHello" ></soap:operation>   
  54.     <input>   
  55.       <soap:body use= "literal"   
  56.         namespace= "http://www.jsoso.com/wstest" ></soap:body>   
  57.     </input>   
  58.     <output>   
  59.       <soap:body use= "literal"   
  60.          namespace= "http://www.jsoso.com/wstest" ></soap:body>   
  61.     </output>   
  62.   </operation>   
  63.   <operation name= "sayHello" >   
  64.     <soap:operation soapAction= "sayHello" ></soap:operation>   
  65.     <input>   
  66.       <soap:body use= "literal"   
  67.         namespace= "http://www.jsoso.com/wstest" ></soap:body>   
  68.     </input>   
  69.     <output>   
  70.       <soap:body use= "literal"   
  71.         namespace= "http://www.jsoso.com/wstest" ></soap:body>   
  72.     </output>   
  73.     <fault name= "HelloException" >   
  74.       <soap:fault name= "HelloException"  use= "literal" ></soap:fault>   
  75.     </fault>   
  76.     </operation>   
  77. </binding>   
  78.   
  79. <service name= "Example" >   
  80.   <port name= "ExamplePort"  binding= "tns:ExamplePortBinding" >   
  81.     <soap:address location= "http://localhost:8080/hello" ></soap:address>   
  82.   </port>   
  83. </service>   
  84. </definitions>  
<?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>

Java代码
  1. <definitions   
  2.  xmlns:soap= "http://schemas.xmlsoap.org/wsdl/soap/"   
  3.  xmlns:tns= "http://www.jsoso.com/wstest"   
  4.  xmlns:xsd= "http://www.w3.org/2001/XMLSchema"   
  5.  xmlns= "http://schemas.xmlsoap.org/wsdl/"   
  6.  targetNamespace= "http://www.jsoso.com/wstest"   
  7.  name= "Example" >   
  8. ……   
  9. ……   
  10. </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>

 

Java代码
  1. <types>   
  2.   <xsd:schema>   
  3.   <xsd: import   
  4.    namespace= "http://www.jsoso.com/wstest"   
  5.    schemaLocation= "http://localhost:8080/hello?xsd=1" ></xsd: import >   
  6.   </xsd:schema>   
  7. </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 >

Java代码
  1. <message name= "toSayHello" >   
  2.   <part name= "userName"  type= "xsd:string" ></part>   
  3. </message>   
  4. <message name= "toSayHelloResponse" >   
  5.   <part name= "returnWord"  type= "xsd:string" ></part>   
  6. </message>   
  7.   
  8. <message name= "sayHello" >   
  9.   <part name= "person"  type= "tns:person" ></part>   
  10.   <part name= "arg1"  type= "xsd:string" ></part>   
  11. </message>   
  12. <message name= "sayHelloResponse" >   
  13.   <part name= "personList"  type= "tns:personArray" ></part>   
  14. </message>   
  15. <message name= "HelloException" >   
  16.   <part name= "fault"  element= "tns:HelloException" ></part>   
  17. </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 >

Java代码
  1. <portType name= "Example" >   
  2.   <operation name= "toSayHello"  parameterOrder= "userName" >   
  3.     <input message= "tns:toSayHello" ></input>   
  4.     <output message= "tns:toSayHelloResponse" ></output>   
  5.   </operation>   
  6.   <operation name= "sayHello"  parameterOrder= "person arg1" >   
  7.     <input message= "tns:sayHello" ></input>   
  8.     <output message= "tns:sayHelloResponse" ></output>   
  9.     <fault message= "tns:HelloException"  name= "HelloException" ></fault>   
  10.   </operation>   
  11. </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 >

Java代码
  1. <binding name= "ExamplePortBinding"  type= "tns:Example" >   
  2.   <soap:binding   
  3.     transport= "http://schemas.xmlsoap.org/soap/http"     
  4.     style= "rpc" ></soap:binding>   
  5.   <operation name= "toSayHello" >   
  6.     <soap:operation soapAction= "sayHello" ></soap:operation>   
  7.     <input>   
  8.       <soap:body use= "literal"   
  9.         namespace= "http://www.jsoso.com/wstest" ></soap:body>   
  10.     </input>   
  11.     <output>   
  12.       <soap:body use= "literal"   
  13.          namespace= "http://www.jsoso.com/wstest" ></soap:body>   
  14.     </output>   
  15.   </operation>   
  16.   <operation name= "sayHello" >   
  17.     <soap:operation soapAction= "sayHello" ></soap:operation>   
  18.     <input>   
  19.       <soap:body use= "literal"   
  20.         namespace= "http://www.jsoso.com/wstest" ></soap:body>   
  21.     </input>   
  22.     <output>   
  23.       <soap:body use= "literal"   
  24.         namespace= "http://www.jsoso.com/wstest" ></soap:body>   
  25.     </output>   
  26.     <fault name= "HelloException" >   
  27.       <soap:fault name= "HelloException"  use= "literal" ></soap:fault>   
  28.     </fault>   
  29.     </operation>   
  30. </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 >

Java代码
  1. <service name= "Example" >   
  2.   <port name= "ExamplePort"  binding= "tns:ExamplePortBinding" >   
  3.     <soap:address location= "http://localhost:8080/hello" ></soap:address>   
  4.   </port>   
  5. </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。

分享到:
评论

相关推荐

    service now web service

    **Service Now Web Service**是一种集成解决方案,它允许不同应用程序之间通过网络进行通信。Service Now 支持多种类型的 Web 服务,包括作为提供者(provider)的入站服务以及作为消费者的出站服务。这使得 Service...

    web service 教程

    webservice 从表面上看Web service 就是一个应用程序它向外界暴露出一个能够通过Web进行调用的API。这就是说你能 够用编程的方法通过Web来调用这个应用程序。 对Web service 更精确的解释 Web ...

    Web service应用实例

    示例代码片段展示了如何创建一个名为`Service`的Web服务类,包含一个`GETDATA`方法,返回一个自定义的结构体`TestData`。 **2. 配置Web.config** 由于VS2005及后续版本的Web Service默认不支持远程调试,需在项目...

    PB11开发Web Service应用

    本篇内容将深入探讨如何利用PB11来开发Web Service应用,这对于初学者来说是一份宝贵的资源。 一、Web Service基础 Web Service是一种基于开放标准的、平台无关的通信协议,它允许不同系统之间的数据交换。在PB11中...

    嵌入式Web Service

    二、嵌入式Web Service概述 嵌入式Web Service是指运行在嵌入式设备上的Web服务,能够通过网络协议与其他设备或服务器进行交互。与传统Web服务相比,它更侧重于资源受限环境下的高性能、低功耗和实时性,适用于智能...

    Java完整的Web Service示例代码,学会做web service程序

    本示例代码将帮助你理解和实现一个完整的Web Service程序。 首先,我们来看"xfire-client"部分。XFire是早先的一个Java Web Service框架,它简化了客户端和服务端的开发。在Java中,创建Web Service客户端通常涉及...

    D6 SOAP_WEB SERVICE程序设计.part1.rar

    第一章 SOAP和Web Service的概念 第二章 组件模型、Internet/Intranet和SOAP 第三章 开发Web Service 第四章 什么是SOAP 第五章 SOAP和数据封装 第六章 SOAP和远程调用 第七章 Web Service和UDDI 第八章 处理复杂...

    典型的Web Service结构

    #### 一、Web Service 概述 Web Service是一种标准的、跨平台的应用程序接口(API),它允许不同技术、不同语言编写的软件通过网络进行交互。无论Web Service是使用何种工具和技术开发的,只要采用SOAP协议并通过HTTP...

    Web应用概述

    Web应用概述 Web应用概述

    用Delphi实现Web Service的简单示例

    在IT领域,Web Service是一种基于开放标准(如XML、SOAP、WSDL和UDDI)的通信协议,它允许不同的应用程序之间进行数据交换。在这个"用Delphi实现Web Service的简单示例"中,我们将探讨如何使用Delphi这一强大的...

    T100 Web Service 接口开发v1.5版.rar

    综上所述,T100 Web Service接口开发v1.5版是一个全面的解决方案,涵盖了接口设计、开发、测试和应用等多个环节。通过深入学习提供的文档、示例和库文件,开发者能够有效地利用这个接口实现T100PDA与其他系统的数据...

    实战Delphi6.Kylix2.SOAP.Web Service程序设计篇李维著.zip

    《实战Delphi6.Kylix2.SOAP.Web Service程序设计篇》是由知名技术专家李维编著的一本专业书籍,主要面向的是希望深入理解和应用Delphi6、Kylix2、SOAP以及Web Service技术的开发者。这本书详细介绍了如何利用这些...

    Web Service

    Web Service服務通常被定義為一組模塊化的API﹐它們可以通過網絡進行調用﹐來執行遠程系統的請求服務。 3.XFire 是 codeHaus 組織提供的一個開源框架,它構建了 POJO 和 SOA 之間的橋樑,主要特性就是支持將 POJO 通...

    实战Delphi6.Kylix2.SOAP.Web Service程序设计篇李维著

    《实战Delphi6.Kylix2.SOAP.Web Service程序设计篇》是由知名技术专家李维撰写的一本专业书籍,主要涵盖了使用Delphi6和Kylix2进行SOAP(简单对象访问协议)以及Web Service开发的核心技术和实践应用。这本书是...

    .net Web Service Studio

    本文将深入探讨.NET Web Service Studio这一强大的Web Service调试工具,旨在帮助开发者更好地理解和利用该工具进行Web Service的开发、测试与调试。 首先,我们要理解什么是Web Service。Web Service是一种基于...

    web service课件

    西北某高等院校研究生的web service课件,英文版的,总共7个ppt,比较简练,适合想快速了解学习web service的学生下载学习,分别是Web Services(ch3.1)、Web Services(ch3.2)、Web Services(ch3.3)、Web Services(ch...

    编写基于.net的WEB SERVICE.rar

    一、Web Service概述 Web Service是通过XML、SOAP(简单对象访问协议)和WSDL(Web服务描述语言)等标准定义的接口,可以被任何支持这些标准的客户端调用。其核心优势在于实现了分布式计算,允许不同的应用系统之间...

    用vfp编写Web Service

    Visual FoxPro(VFP),作为一款老牌的数据库开发工具,虽然在现代编程语言中已显得较为陈旧,但它依然具有强大的功能,可以用来创建Web Service。本文将深入探讨如何利用VFP来编写Web Service,帮助开发者理解这一...

Global site tag (gtag.js) - Google Analytics