Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Wsdl

2,439 views

Published on

Published in: Technology, News & Politics
  • Be the first to comment

Wsdl

  1. 1. Web 服务描述语言 WSDL 马殿富 北航计算机学院 2006-05
  2. 2. 主要内容 <ul><li>WSDL 发展历史 </li></ul><ul><li>WSDL 的基本属性 </li></ul><ul><li>WSDL 的定义 </li></ul><ul><li>WSDL 的文档框架 </li></ul><ul><li>--类型 消息 端口类型 绑定 服务 </li></ul><ul><li>WSDL 中的 4 种消息交换方式 </li></ul><ul><li>WSDL 中的 4 种消息传递模式 </li></ul>
  3. 3. 发展历史 <ul><li>Web 服务描述语言 WSDL ( Web Services Description Language )是一个建议性标准。用于描述 Webb 服务的技术调用语法。 </li></ul><ul><li>1999 年 HP (惠普)公司是第一个引入 Web 服务概念, eSpeak 实现了“电子服务”平台。 </li></ul><ul><li>2000 年 6 月 Microsoft 提出了“ Web 服务”术语,把 Web 服务作为 .NET 计划重要组件。 </li></ul><ul><li>在 Microsoft 的 SDL ( Service Description Language 和 SCL ( SOAP Contract Language )和 IBM 的 NASSL ( Network Accessible Service Specification Language )这两项技术的结合,形成了 WSDL 的基础。 SCL 采用 XML 来描述应用程序所交换的消息, NASSL 描述服务接口和实现细节。 </li></ul><ul><li>2000 年 9 月 25 日 IBM 、 Microsoft 和 Ariba 提出 WSDL1.0 。 2001 年 3 月 15 日,他们提交的 WSDL1.1 成为 W3C 的 Note 。 WSDL1.1 规范网址是 http://www.w3.org/TR/wsdl 。 2002 年 7 月 9 日提出 WSDL1.2 , 2003 年 11 月 10 日提出 WSDL2.0 。 </li></ul>
  4. 4. <ul><li>WSDL 描述 web 服务的三个基本属性: </li></ul><ul><li>服务做些什么 ? </li></ul><ul><ul><li>服务所提供的操作 ( 方法 ) ; </li></ul></ul><ul><li>如何访问服务? </li></ul><ul><ul><li>数据格式以及访问服务操作的必要协议; </li></ul></ul><ul><li>服务位于何处? </li></ul><ul><ul><li>由特定协议决定的网络地址,如 URL 。 </li></ul></ul>
  5. 5. <ul><li>Web 服务描述语言( Web Services Description Language WSDL )是 Web Services 技术重要组成部分。 </li></ul><ul><li>WSDL 描述了分布在 Internet 环境中服务操作的抽象定义接口和服务的具体实现端口,实现远程计算资源共享。 </li></ul><ul><li>WSDL 通常是协议定义的,协议描述缺乏准确性和严格性,需要一种形式化的表示和描述方法。 </li></ul>
  6. 6. 面向服务视图 <ul><li>规范描述资源与协议变换 </li></ul><ul><li>实现自动服务部署和调用 </li></ul>Content JAVA2WSDL WSDL2JAVA UDDI 资源 服务 运行时 客户端(人) 客户端(机器) 发布 发现与定位 发现与定位 操作 浏览器 AJAX
  7. 7. SOAP RPC <ul><li>SOAP 文档内容 </li></ul><ul><ul><li><soap:envelope> </li></ul></ul><ul><ul><li><soap:body> </li></ul></ul><ul><ul><li>< myMethod > </li></ul></ul><ul><ul><li><x>5</x> </li></ul></ul><ul><ul><li></myMethod> </li></ul></ul><ul><ul><li></soap:body> </li></ul></ul><ul><ul><li></soap:envelope> </li></ul></ul>
  8. 8. 服务调用 前置机 SOAP 消息 HTTP HTTP WSDL2JAVA SOAP 消息 Class Operation XML Message 服务描述 CONTEXT XML2JAVA XML Message
  9. 9. WSDL 定义 <ul><li>WSDL 是 XML 描述的网络服务,基于消息机制、包含面向文本或面向过程信息的操作集合。 </li></ul><ul><li>操作及消息的抽象定义与它们具体的网络实现和数据格式绑定是分离的 , 这样就可以重用这些抽象定义。 </li></ul><ul><li>消息是需要交换数据的抽象描述; </li></ul><ul><li>端点类型是操作的抽象集合。 </li></ul><ul><li>针对一个特定端点类型的具体协议和数据格式规范构成一个可重用的绑定。 </li></ul><ul><li>一个端点定义成网络地址和可重用的绑定的联接,端点的集合定义为服务。 </li></ul>
  10. 10. 服务接口定义和服务实现定义 <ul><li>服务接口 组成了服务描述中的可重用部分, </li></ul><ul><ul><li>type 元素、 message 和 portType 。 </li></ul></ul><ul><ul><li>types 元素中描述消息中复杂数据类型的使用。 </li></ul></ul><ul><ul><li>message 元素指定 XML 数据类型组成消息的各个部分。 message 元素用于定义操作的输入和输出参数。 </li></ul></ul><ul><ul><li>portType 元素中定义了 Web 服务的操作。操作定义了输入和输出数据流中可以出现的 XML 消息。 </li></ul></ul>
  11. 11. 服务接口定义和服务实现定义 <ul><li>服务实现 定义是一个描述给定服务提供者如何实现特定服务接口的 WSDL 文档。 </li></ul><ul><ul><li>有 binding 和 services 。 </li></ul></ul><ul><ul><li>binding 元素描述特定服务接口的协议、数据格式、安全性和其它属性。 </li></ul></ul><ul><ul><li>service 元素。服务元素包含一组 port 元素。端口将端点与来自服务接口定义的 binding 元素关联起来。 </li></ul></ul>
  12. 12. <ul><li>WSDL 是一种 XML 应用 , 它将 Web Services 描述定义为一组服务访问端点,客户端可以通过这些服务访问端点对包含面向文档信息或面向过程调用的服务进行访问。 </li></ul><ul><li>WSDL 首先对访问的操作和访问时使用的请求/响应消息进行抽象描述,然后将其绑定到具体的传输协议和消息格式上,以最终定义具体部署的服务访问端点。 </li></ul><ul><li>在具体使用中,可以使用任意的消息格式和网络协议。 </li></ul><ul><li>在 WSDL 规范中,定义了如何使用 SOAP 消息格式、 HTTP GET / POST 消息格式以及 MIME 格式来完成 Web Services 交互的规范。 </li></ul>
  13. 13. WSDL 特点 <ul><li>实现 Web 服务体系结构的松散耦合; </li></ul><ul><li>无论是请求者还是提供者可以各自独立地使用平台、编程语言或分布式对象模型。 </li></ul>
  14. 14. 命名空间 <ul><li>wsdl http://schemas.xmlsoap.org/wsdl/ </li></ul><ul><li>soap http://schemas.xmlsoap.org/wsdl/soap/ </li></ul><ul><li>http http://schemas.xmlsoap.org/wsdl/http/ </li></ul><ul><li>mime http://schemas.xmlsoap.org/wsdl/mime/ </li></ul><ul><li>soapenc http://schemas.xmlsoap.org/soap/encoding/ </li></ul><ul><li>soapenv http://schemas.xmlsoap.org/soap/envelope/ </li></ul><ul><li>xsi http://www.w3.org/2000/10/XMLSchema-instance </li></ul><ul><li>xsd http://www.w3.org/2000/10/XMLSchema </li></ul>
  15. 15. WSDL 文档框架 <ul><li><wsdl:definitions name=&quot;nmtoken&quot;? targetNamespace=&quot;uri&quot;?> </li></ul><ul><li><import namespace=&quot;uri&quot; location=&quot;uri&quot;/>* </li></ul><ul><li><wsdl:types> ? ……</wsdl:types> </li></ul><ul><li><wsdl:message name=“nmtoken”>* </li></ul><ul><li>…… </wsdl:message> </li></ul><ul><li><wsdl:portType name=&quot;nmtoken&quot;>* </li></ul><ul><li>…… </wsdl:portType> </li></ul><ul><li><wsdl:binding name=&quot;nmtoken&quot; type=&quot;qname&quot;>* </li></ul><ul><li>…… </wsdl:binding> </li></ul><ul><li><wsdl:service name=&quot;nmtoken&quot;>*……</wsdl:service> </li></ul><ul><li></wsdl:definitions> </li></ul>
  16. 16. types 元素 <ul><li><wsdl:types> ? </li></ul><ul><li><wsdl:documentation .... />? </li></ul><ul><li><xsd:schema .... />* </li></ul><ul><li><-- extensibility element --> * </li></ul><ul><li></wsdl:types> </li></ul>
  17. 17. message 元素 <ul><li><wsdl:message name=&quot;nmtoken&quot;> * </li></ul><ul><li><wsdl:documentation .... />? </li></ul><ul><li><part name=&quot;nmtoken&quot; </li></ul><ul><li>element=&quot;qname&quot;? type=&quot;qname&quot;?/> * </li></ul><ul><li></wsdl:message> </li></ul>
  18. 18. portType 元素 <ul><li><wsdl:portType name=&quot;nmtoken&quot;>* </li></ul><ul><li><wsdl:documentation .... />? </li></ul><ul><li><wsdl:operation name=&quot;nmtoken&quot;>* </li></ul><ul><li><wsdl:documentation .... /> ? </li></ul><ul><li><wsdl:input name=&quot;nmtoken&quot;? message=&quot;qname&quot;>? </li></ul><ul><li><wsdl:documentation .... /> ? </li></ul><ul><li></wsdl:input> </li></ul><ul><li><wsdl:output name=&quot;nmtoken&quot;? message=&quot;qname&quot;>? </li></ul><ul><li><wsdl:documentation .... /> ? </li></ul><ul><li></wsdl:output> </li></ul><ul><li><wsdl:fault name=&quot;nmtoken&quot; message=&quot;qname&quot;> * </li></ul><ul><li><wsdl:documentation .... /> ? </li></ul><ul><li></wsdl:fault> </li></ul><ul><li></wsdl:operation> </li></ul><ul><li></wsdl:portType> </li></ul>
  19. 19. binding 元素 <ul><li><wsdl:binding name=&quot;nmtoken&quot; type=&quot;qname&quot;>* </li></ul><ul><li><wsdl:documentation .... />? </li></ul><ul><li><-- extensibility element --> * </li></ul><ul><li><wsdl:operation name=&quot;nmtoken&quot;>* </li></ul><ul><li><wsdl:documentation .... /> ? </li></ul><ul><li><-- extensibility element --> * </li></ul><ul><li><wsdl:input> ? </li></ul><ul><li><wsdl:documentation .... /> ? </li></ul><ul><li><-- extensibility element --> </li></ul><ul><li></wsdl:input> </li></ul><ul><li><wsdl:output> ? </li></ul><ul><li><wsdl:documentation .... /> ? </li></ul><ul><li><-- extensibility element --> * </li></ul><ul><li></wsdl:output> </li></ul><ul><li><wsdl:fault name=&quot;nmtoken&quot;> * </li></ul><ul><li><wsdl:documentation .... /> ? </li></ul><ul><li><-- extensibility element --> * </li></ul><ul><li></wsdl:fault> </li></ul><ul><li></wsdl:operation> </li></ul><ul><li></wsdl:binding> </li></ul>
  20. 20. service 元素 <ul><li><wsdl:service name=&quot;nmtoken&quot;> * </li></ul><ul><li><wsdl:documentation .... />? </li></ul><ul><li><wsdl:port name=&quot;nmtoken&quot; binding=&quot;qname&quot;>* </li></ul><ul><li><wsdl:documentation .... /> ? </li></ul><ul><li><-- extensibility element --> </li></ul><ul><li></wsdl:port> </li></ul><ul><li><-- extensibility element --> </li></ul><ul><li></wsdl:service> </li></ul>
  21. 21. 类型 <ul><li>types 元素包含了交换消息的数据类型定义。为了实现最大的互操作性( interoperability )和平台中立性( neutrality ), WSDL 选用 XML Schema DataTypes ,简称 XSD 作为标准类型系统,并将它作为固有类型系统。 </li></ul><ul><li><definitions .... > </li></ul><ul><li><types> </li></ul><ul><li><xsd:schema .... />* </li></ul><ul><li></types> </li></ul><ul><li></definitions> </li></ul>
  22. 22. 类型— XSD 编码抽象数据类型建议 <ul><li>使用元素( element )形式,而不使用属性 (attribute) 形式; </li></ul><ul><li>不包括仅在特殊的协议和数据格式中使用的元素或者属性; </li></ul><ul><li>数组类型使用 Soap:Array 类型,并使用 ArrayOfXXX 作为数组类型的名; </li></ul><ul><li>使用 XSD 编码表示 xsd:anyType 。 </li></ul>
  23. 23. <ul><li><types> </li></ul><ul><li><schema…> </li></ul><ul><li><element name=&quot;PO&quot; type=&quot;tns:POType&quot;/> </li></ul><ul><li><complexType name=&quot;POType&quot;> </li></ul><ul><li><element name=&quot;id&quot; type=&quot;string/> </li></ul><ul><li><element name=&quot;name&quot; type=&quot;string&quot;/> </li></ul><ul><li><element name=&quot;items&quot;> </li></ul><ul><li><complexType> </li></ul><ul><li><element name=&quot;item&quot; type=&quot;tns:Item&quot; minOccurs=&quot;0“ </li></ul><ul><li>maxOccurs=&quot;unbounded&quot;/> </li></ul><ul><li></complexType> </li></ul><ul><li></element> </li></ul><ul><li></complexType> </li></ul><ul><li><complexType name=&quot;Item&quot;> </li></ul><ul><li><element name=&quot;quantity&quot; type=&quot;int&quot;/> </li></ul><ul><li><element name=&quot;product&quot; type=&quot;string&quot;/> </li></ul><ul><li></complexType> </li></ul><ul><li><element name=&quot;Customer&quot; type=&quot;tns:CustomerType&quot;/> </li></ul><ul><li><complexType name=&quot;CustomerType&quot;> </li></ul><ul><li><element name=&quot;name&quot; type=&quot;string&quot;/> </li></ul><ul><li></complexType> </li></ul><ul><li></schema> </li></ul><ul><li></types> </li></ul>
  24. 24. 消息 <ul><li>消息由若干个逻辑部件( part )构成。每个部件使用一个消息类型属性与某个类型系统的类型相关联。 </li></ul><ul><li>消息定义与法如下: </li></ul><ul><li><definitions .... > </li></ul><ul><li><message name=&quot;nmtoken&quot;> * </li></ul><ul><li><part name=&quot;nmtoken&quot; </li></ul><ul><li>element=&quot;qname&quot;? type=&quot;qname&quot;?/> * </li></ul><ul><li></message> </li></ul><ul><li></definitions> </li></ul><ul><li>消息 (message)name 属性指定了消息的名称。 </li></ul><ul><li>如果消息具有多个逻辑单位,则需要使用多个 part 元素。 </li></ul>
  25. 25. 消息示例 <ul><li><message name=&quot;PO&quot;> </li></ul><ul><li><part name=&quot;po&quot; element=&quot;tns:PO&quot;/> </li></ul><ul><li><part name=&quot;customer&quot; element=&quot;tns:Customer&quot;/> </li></ul><ul><li></message> </li></ul><ul><li><message name=&quot;P1&quot;> </li></ul><ul><li><part name=“address&quot; type=“XSD:string&quot;/> </li></ul><ul><li></message> </li></ul><ul><li><message name=&quot;P2&quot;> </li></ul><ul><li><part name=&quot;composite&quot; type=&quot;tns:Composite&quot;/> </li></ul><ul><li></message> </li></ul>
  26. 26. <ul><li>s= λ (&s,&quot;definition * &quot;) </li></ul><ul><li>在 WSDL 文档中,消息名称定义具有唯一性,即 </li></ul><ul><ul><li> x  λ (&s,&quot; message &quot;) </li></ul></ul><ul><ul><li>(  y  λ (&s,&quot; message &quot;,&quot;name&quot;, σ (&x,&quot;name&quot;))  x=y) </li></ul></ul><ul><li>在消息定义中,部件名称定义具有唯一性,即 </li></ul><ul><ul><li> x  λ (&s,&quot; message &quot;) </li></ul></ul><ul><ul><li> y  λ (&x,&quot; message part &quot;) </li></ul></ul><ul><ul><li>(  z  λ (&x,&quot; message part &quot;,&quot;name&quot;, σ (&y,&quot;name&quot;)) </li></ul></ul><ul><ul><li> y=z) </li></ul></ul>
  27. 27. <ul><li>消息类型属性集合是可扩展的。 WSDL 定义如下消息类型属性 </li></ul><ul><li>element :使用 QName 引用一个 XSD 元素,即 </li></ul><ul><ul><li> x  λ (&s, &quot;messagepart&quot;) </li></ul></ul><ul><ul><li>( σ (&x,&quot;element&quot;)  </li></ul></ul><ul><ul><li> ! y  λ (&s,&quot;typesschemaelement&quot;) </li></ul></ul><ul><li> σ (&x,&quot;element&quot;)= σ (&y,&quot;name&quot;))) </li></ul><ul><li>type :使用 QName 引用个 XSD simpleType( 简单类型 ) 或 XSD complexType ( 复含类型 ) ,即 </li></ul><ul><ul><li> x  λ (&s,&quot;messagepart&quot;) </li></ul></ul><ul><ul><li>( σ (&x,&quot;type&quot;)  </li></ul></ul><ul><ul><li> σ (&x,&quot;type&quot;)  XSDtypes) </li></ul></ul><ul><li> y  λ (&s,&quot;typesschemacomplexType&quot;) </li></ul><ul><li>( σ (&x,&quot;type&quot;)= σ (&y,&quot;name&quot;)) </li></ul><ul><li> y  λ (&s,&quot;typesschemasimpleType&quot;) </li></ul><ul><li>( σ (&x,&quot;type&quot;)= σ (&y,&quot;name&quot;))) </li></ul>
  28. 28. 端口类型定义 <ul><li>端口类型是一个由抽象操作和抽象消息构成的有名称的集合。 </li></ul><ul><li><wsdl:definitions .... > </li></ul><ul><li><wsdl:portType name=&quot;nmtoken&quot;> * </li></ul><ul><li><wsdl:operation name=&quot;nmtoken&quot;> </li></ul><ul><li><wsdl:input name=&quot;nmtoken&quot;? message=&quot;qname&quot;/> </li></ul><ul><li><wsdl:output name=&quot;nmtoken&quot;? message=&quot;qname&quot;/> </li></ul><ul><li><wsdl:fault name=&quot;nmtoken&quot; message=&quot;qname&quot;/>* </li></ul><ul><li></wsdl:operation> </li></ul><ul><li></wsdl:portType > </li></ul><ul><li></wsdl:definitions> </li></ul><ul><li>端口类型定义的 name 属性表示端口类型名称,操作定义的 name 属性表示操作名称。 </li></ul>
  29. 29. <ul><li>s= λ (&s,&quot;definition * &quot;) </li></ul><ul><li>端口类型名称具有唯一性,即 </li></ul><ul><ul><li> x  λ (&s,&quot; portType &quot;) </li></ul></ul><ul><ul><li>(  y  λ (&s,&quot; portType &quot;,&quot;name&quot;, σ (&x,&quot;name&quot;)) </li></ul></ul><ul><ul><li> x=y) </li></ul></ul><ul><li>在相同端口类型中,操作名称具有唯一性,即 </li></ul><ul><li> x  λ (&s,&quot; portType &quot;) </li></ul><ul><li> y  λ (&x,&quot; portType operation &quot;) </li></ul><ul><li>(  z  λ (&x,&quot; portType operation &quot;,&quot;name&quot;, σ (&y,&quot;name&quot;)) </li></ul><ul><li> y=z) </li></ul>
  30. 30. <ul><li>在不同的端口类型中,如果操作名称相同,则操作定义相同。 </li></ul><ul><ul><li> x  λ (&s,&quot; portType operation &quot;) </li></ul></ul><ul><ul><li>(  y  λ (&s,&quot; portType operation &quot;,&quot;name&quot;, σ (&x,&quot;name&quot;))  x=y) </li></ul></ul><ul><li>操作的 input 、 output 和 fault 元素的 message 属性所指定的消息,在 WSDL 的 message 中已定义,即 </li></ul><ul><ul><li> x  λ (&s,&quot;portTypeoperationinput&quot;) </li></ul></ul><ul><ul><li> y  λ (&s,&quot;message&quot;)( σ (&x,&quot;message&quot;)= σ (&y,&quot;name&quot;)) </li></ul></ul><ul><ul><li> x  λ (&s,&quot;portType operationoutput&quot;) </li></ul></ul><ul><ul><li> y  λ (&s,&quot;message&quot;)( σ (&x,&quot;message&quot;)= σ (&y,&quot;name&quot;)) </li></ul></ul><ul><ul><li> x  λ (&s,&quot;portType operationfault&quot;) </li></ul></ul><ul><ul><li> y  λ (&s,&quot;message&quot;)( σ (&x,&quot;message&quot;)= σ (&y, &quot;name&quot;)) </li></ul></ul>
  31. 31. 操作 <ul><li>WSDL 支持 4 种消息交换方式,来访问服务端点。 </li></ul><ul><ul><li>单向( One-way ):服务访问端点接收消息; </li></ul></ul><ul><ul><li>请求响应( Request-response ):服务访问端点接收请求消息,然后发送响应消息; </li></ul></ul><ul><ul><li>要求应答( Solicit-response ):服务访问端点发送要求消息,然后接收应答消息; </li></ul></ul><ul><ul><li>通知( Notification ):服务访问端点发送通知消息。 </li></ul></ul><ul><li>操作中引用到的消息通过 message 属性指定。 </li></ul>
  32. 32. 单向操作 <ul><li>单向操作语法: </li></ul><ul><li><wsdl:definitions .... > </li></ul><ul><li><wsdl:portType .... > * </li></ul><ul><li><wsdl:operation name=&quot;nmtoken&quot;> </li></ul><ul><li><wsdl:input name=&quot;nmtoken&quot;? message=&quot;qname&quot;/> </li></ul><ul><li></wsdl:operation> </li></ul><ul><li></wsdl:portType > </li></ul><ul><li></wsdl:definitions> </li></ul><ul><li>input 元素指定用于单向操作的抽象消息格式。 </li></ul>
  33. 33. 请求响应操作 <ul><li>请求响应操作语法 </li></ul><ul><li><wsdl:definitions .... > </li></ul><ul><li><wsdl:portType .... > * </li></ul><ul><li><wsdl:operation name=&quot;nmtoken&quot; </li></ul><ul><li>parameterOrder=&quot;nmtokens&quot;> </li></ul><ul><li><wsdl:input name=&quot;nmtoken&quot;? message=&quot;qname&quot;/> </li></ul><ul><li><wsdl:output name=&quot;nmtoken&quot;? message=&quot;qname&quot;/> </li></ul><ul><li><wsdl:fault name=&quot;nmtoken&quot; message=&quot;qname&quot;/>* </li></ul><ul><li></wsdl:operation> </li></ul><ul><li></wsdl:portType > </li></ul><ul><li></wsdl:definitions> </li></ul>
  34. 34. 要求应答操作 <ul><li>要求应答操作语法 </li></ul><ul><li><wsdl:definitions .... > </li></ul><ul><li><wsdl:portType .... > * </li></ul><ul><li><wsdl:operation name=&quot;nmtoken&quot; </li></ul><ul><li>parameterOrder=&quot;nmtokens&quot;> </li></ul><ul><li><wsdl:output name=&quot;nmtoken&quot;? message=&quot;qname&quot;/> </li></ul><ul><li><wsdl:input name=&quot;nmtoken&quot;? message=&quot;qname&quot;/> </li></ul><ul><li><wsdl:fault name=&quot;nmtoken&quot; message=&quot;qname&quot;/>* </li></ul><ul><li></wsdl:operation> </li></ul><ul><li></wsdl:portType > </li></ul><ul><li></wsdl:definitions> </li></ul>
  35. 35. 通知操作 <ul><li>通知操作语法 </li></ul><ul><li><wsdl:definitions .... > </li></ul><ul><li><wsdl:portType .... > * </li></ul><ul><li><wsdl:operation name=&quot;nmtoken&quot;> </li></ul><ul><li><wsdl:output name=&quot;nmtoken&quot;? </li></ul><ul><li>message=&quot;qname&quot;/> </li></ul><ul><li></wsdl:operation> </li></ul><ul><li></wsdl:portType > </li></ul><ul><li></wsdl:definitions> </li></ul>
  36. 36. 操作中的元素名称 <ul><li>如果单向操作和通知操作未指定 name 属性,则该属性名默认为是操作名。 </li></ul><ul><li>如果请求响应或要求应答操作中未指定 name 属性,则该属性名默认为是 </li></ul><ul><ul><li>操作名 +“Request”/“Responese”/“Solicit” 。 </li></ul></ul><ul><li>针对于请求应答和要求应答操作可以通过 parameterOrder 指定一个参数名列表。该属性的值是一个用空格分开的消息构件名序列 。 </li></ul>
  37. 37. 绑定 <ul><li>绑定语法如下: </li></ul><ul><li><wsdl:definitions .... > </li></ul><ul><li><wsdl:binding name=&quot;nmtoken&quot; type=&quot;qname&quot;> * </li></ul><ul><li><-- extensibility element (1) --> * </li></ul><ul><li><wsdl:operation name=&quot;nmtoken&quot;> * </li></ul><ul><li><-- extensibility element (2) --> * </li></ul><ul><li><wsdl:input name=&quot;nmtoken&quot;? > ? </li></ul><ul><li><-- extensibility element (3) --> </li></ul><ul><li></wsdl:input> </li></ul><ul><li><wsdl:output name=&quot;nmtoken&quot;? > ? </li></ul><ul><li><-- extensibility element (4) --> * </li></ul><ul><li></wsdl:output> </li></ul><ul><li><wsdl:fault name=&quot;nmtoken&quot;> * </li></ul><ul><li><-- extensibility element (5) --> * </li></ul><ul><li></wsdl:fault> </li></ul><ul><li></wsdl:operation> </li></ul><ul><li></wsdl:binding> </li></ul><ul><li></wsdl:definitions> </li></ul>
  38. 38. 服务与访问端点 <ul><li>访问端点( port )通过为绑定指定唯一地址来定义一个访问端点。访问端点语法如下: </li></ul><ul><li><wsdl:definitions .... > </li></ul><ul><li><wsdl:service .... > * </li></ul><ul><li><wsdl:port name=&quot;nmtoken&quot; binding=&quot;qname&quot;>* </li></ul><ul><li><-- extensibility element (1) --> </li></ul><ul><li></wsdl:port> </li></ul><ul><li></wsdl:service> </li></ul><ul><li></wsdl:definitions> </li></ul><ul><li>在 WSDL 文档范围内,访问端点的 name 属性具有唯一性。 </li></ul>
  39. 39. 服务 <ul><li>服务是访问端点集合,服务语法如下: </li></ul><ul><li><wsdl:definitions .... > </li></ul><ul><li><wsdl:service name=&quot;nmtoken&quot;>* </li></ul><ul><li><wsdl:port ..../>* </li></ul><ul><li></wsdl:service> </li></ul><ul><li></wsdl:definitions> </li></ul><ul><li>在 WSDL 文档中,服务的 name 属性具有唯一性。 </li></ul>
  40. 40. <ul><li>服务中的访问端点具有如下的关系 : </li></ul><ul><ul><li>所有访问端点都不相互通信,即一个服务的访问端点的输出不会是另一个访问端点的输入。 </li></ul></ul><ul><ul><li>如果一个服务中有多个访问端点属于同一端口类型,但是对应不同的绑定或者地址,则这些访问端点可以相互替换。这使得 WSDL 文档使用者根据需要选择访问端点。 </li></ul></ul><ul><ul><li>通过检查访问端点可以确定服务的端口类型。这使得 WSDL 文档的使用者能够根据它支持的端口类型决定是否与一个特定的服务通讯。 </li></ul></ul>
  41. 41. SOAP 绑定 <ul><li><binding…> </li></ul><ul><li><soap:binding style=&quot;rpc|document&quot; transport=&quot;uri&quot;> </li></ul><ul><li><operation…> </li></ul><ul><li><soap:operation soapAction=&quot;uri&quot;? style=&quot;rpc|document&quot;?>? </li></ul><ul><li><input> </li></ul><ul><li><soap:body parts=&quot;nmtokens&quot;? use=&quot;literal|encoded&quot; </li></ul><ul><li>encodingStyle=&quot;uri-list&quot;? namespace=&quot;uri&quot;?> </li></ul><ul><li><soap:header element=&quot;qname&quot; fault=&quot;qname&quot;?>* </li></ul><ul><li></input> </li></ul><ul><li><output> </li></ul><ul><li><soap:body parts=&quot;nmtokens&quot;? use=&quot;literal|encoded&quot; </li></ul><ul><li>encodingStyle=&quot;uri-list&quot;? namespace=&quot;uri&quot;?> </li></ul><ul><li><soap:header element=&quot;qname&quot; fault=&quot;qname&quot;?>* </li></ul><ul><li></output> </li></ul><ul><li><fault>* </li></ul><ul><li><soap:fault name=&quot;nmtoken&quot; use=&quot;literal|encoded&quot; </li></ul><ul><li>encodingStyle=&quot;uri-list&quot;? namespace=&quot;uri&quot;?> </li></ul><ul><li></fault> </li></ul><ul><li></operation> </li></ul><ul><li></binding> </li></ul>
  42. 42. soap:binding 元素 <ul><li>SOAP:binding 元素表明 WSDL 文档绑定到 SOAP 协议格式 , 该元素在使用 SOAP 绑定时是必需的。 </li></ul><ul><li><definitions .... > </li></ul><ul><li><binding .... > </li></ul><ul><li><soap:binding transport=&quot;uri&quot;? </li></ul><ul><li>style=&quot;rpc|document&quot;?> </li></ul><ul><li></binding> </li></ul><ul><li></definitions> </li></ul><ul><li>style 属性值是它所包含的操作子元素的 style 属性的默认值。 </li></ul><ul><li>transport 属性是必需的,它的值表示绑定的传输方式与 SOAP 的何种传输方式一致。 URI 值 http://schemas.xmlsoap.org/soap/http 表示传输方式和 SOAP 规范的 HTTP 绑定相一致。 </li></ul>
  43. 43. soap:operation <ul><li><definitions .... > </li></ul><ul><li><binding .... > </li></ul><ul><li><operation .... > </li></ul><ul><li><soap:operation soapAction=&quot;uri&quot;? </li></ul><ul><li>style=&quot;rpc|document&quot;?>? </li></ul><ul><li></operation> </li></ul><ul><li></binding> </li></ul><ul><li></definitions> </li></ul>
  44. 44. soap:body <ul><li><definitions .... > </li></ul><ul><li><binding .... > </li></ul><ul><li><operation .... > </li></ul><ul><li><input> </li></ul><ul><li><soap:body parts=&quot;nmtokens&quot;? use=&quot;literal|encoded&quot;? </li></ul><ul><li>encodingStyle=&quot;uri-list&quot;? </li></ul><ul><li>namespace=&quot;uri&quot;?> </li></ul><ul><li></input> </li></ul><ul><li><output> </li></ul><ul><li><soap:body parts=&quot;nmtokens&quot;? use=&quot;literal|encoded&quot;? </li></ul><ul><li>encodingStyle=&quot;uri-list&quot;? namespace=&quot;uri&quot;?> </li></ul><ul><li></output> </li></ul><ul><li></operation> </li></ul><ul><li></binding> </li></ul><ul><li></definitions> </li></ul>
  45. 45. soap:fault <ul><li><definitions .... > </li></ul><ul><li><binding .... > </li></ul><ul><li><operation .... > </li></ul><ul><li><fault>* </li></ul><ul><li><soap:fault name=&quot;nmtoken&quot; </li></ul><ul><li>use=&quot;literal|encoded&quot; </li></ul><ul><li>encodingStyle=&quot;uri-list&quot;? </li></ul><ul><li>namespace=&quot;uri&quot;?> </li></ul><ul><li></fault> </li></ul><ul><li></operation> </li></ul><ul><li></binding> </li></ul><ul><li></definitions> </li></ul>
  46. 46. soap:header 和 soap:headerfault <ul><li><definitions .... > </li></ul><ul><li><binding .... > </li></ul><ul><li><operation .... > </li></ul><ul><li><input> </li></ul><ul><li><soap:header message=&quot;qname&quot; part=&quot;nmtoken&quot; use=&quot;literal|encoded&quot; </li></ul><ul><li>encodingStyle=&quot;uri-list&quot;? namespace=&quot;uri&quot;?>* </li></ul><ul><li><soap:headerfault message=&quot;qname&quot; part=&quot;nmtoken&quot; use=&quot;literal|encoded&quot; </li></ul><ul><li>encodingStyle=&quot;uri-list&quot;? namespace=&quot;uri&quot;?/>* </li></ul><ul><li><soap:header> </li></ul><ul><li></input> </li></ul><ul><li><output> </li></ul><ul><li><soap:header message=&quot;qname&quot; part=&quot;nmtoken&quot; use=&quot;literal|encoded&quot; </li></ul><ul><li>encodingStyle=&quot;uri-list&quot;? namespace=&quot;uri&quot;?>* </li></ul><ul><li><soap:headerfault message=&quot;qname&quot; part=&quot;nmtoken&quot; use=&quot;literal|encoded&quot; </li></ul><ul><li>encodingStyle=&quot;uri-list&quot;? namespace=&quot;uri&quot;?/>* </li></ul><ul><li><soap:header> </li></ul><ul><li></output> </li></ul><ul><li></operation> </li></ul><ul><li></binding> </li></ul><ul><li></definitions> </li></ul>
  47. 47. soap:address <ul><li><definitions .... > </li></ul><ul><li><port .... > </li></ul><ul><li><soap:address location=&quot;uri&quot;/> </li></ul><ul><li></port> </li></ul><ul><li></definitions> </li></ul>
  48. 48. portType 、 binding 与 port <ul><li>一个 portType 可以对应多个 bindng </li></ul><ul><li>一个 binding 可以对应多个 port </li></ul>portType port port port binding binding binding port
  49. 49. 消息传递模式 <ul><li>1 . rpc/encoded </li></ul><ul><li>2 . rpc/literal </li></ul><ul><li>3 . document/encoded </li></ul><ul><li>4 . document/literal </li></ul>
  50. 50. 服务 <ul><li>public class myServices { </li></ul><ul><li>public void myMethod (int x){ </li></ul><ul><li>return </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  51. 51. rpc/encoded 样式 <ul><li>WSDL 文档内容 </li></ul><ul><ul><li><message name=&quot; myMethodRequest &quot;> </li></ul></ul><ul><ul><li><part name=&quot;x&quot; type=&quot;xsd:int&quot;/> </li></ul></ul><ul><ul><li></message> </li></ul></ul><ul><ul><li><message name=&quot;empty&quot;/> </li></ul></ul><ul><ul><li><portType name=&quot;PT&quot;> </li></ul></ul><ul><ul><li><operation name=&quot;myMethod&quot;> </li></ul></ul><ul><ul><li><input message=&quot; myMethodRequest &quot;/> </li></ul></ul><ul><ul><li><output message=&quot;empty&quot;/> </li></ul></ul><ul><ul><li></operation> </li></ul></ul><ul><ul><li></portType> </li></ul></ul>
  52. 52. rpc/encoded 样式 <ul><li>SOAP 文档内容 </li></ul><ul><ul><li><soap:envelope> </li></ul></ul><ul><ul><li><soap:body> </li></ul></ul><ul><ul><li><myMethod> </li></ul></ul><ul><ul><li><x xsi:type =&quot; xsd:int &quot;>5</x> </li></ul></ul><ul><ul><li></myMethod> </li></ul></ul><ul><ul><li></soap:body> </li></ul></ul><ul><ul><li></soap:envelope> </li></ul></ul>
  53. 53. 2 rpc/literal 样式 <ul><li>WSDL 文档内容 </li></ul><ul><ul><li><message name=&quot; myMethodRequest &quot;> </li></ul></ul><ul><ul><li><part name=&quot;x&quot; type=&quot;xsd:int&quot;/> </li></ul></ul><ul><ul><li></message> </li></ul></ul><ul><ul><li><message name=&quot;empty&quot;/> </li></ul></ul><ul><ul><li><portType name=&quot;PT&quot;> </li></ul></ul><ul><ul><li><operation name=&quot;myMethod&quot;> </li></ul></ul><ul><ul><li><input message=&quot; myMethodRequest &quot;/> </li></ul></ul><ul><ul><li><output message=&quot;empty&quot;/> </li></ul></ul><ul><ul><li></operation> </li></ul></ul><ul><ul><li></portType> </li></ul></ul>
  54. 54. 2 rpc/literal 样式 <ul><li>SOAP 文档内容 </li></ul><ul><ul><li><soap:envelope> </li></ul></ul><ul><ul><li><soap:body> </li></ul></ul><ul><ul><li>< myMethod > </li></ul></ul><ul><ul><li><x>5</x> </li></ul></ul><ul><ul><li></myMethod> </li></ul></ul><ul><ul><li></soap:body> </li></ul></ul><ul><ul><li></soap:envelope> </li></ul></ul>
  55. 55. 3 document /encoded <ul><li>WSDL 文档内容 </li></ul><ul><li><types> </li></ul><ul><li><schema> </li></ul><ul><li><element name=&quot;xElement&quot; type=&quot;xsd:int&quot;/> </li></ul><ul><li></schema> </li></ul><ul><li></types> </li></ul><ul><li><message name=&quot; myMethodRequest &quot;> </li></ul><ul><li><part name=&quot;x&quot; element=&quot;xElement&quot;/> </li></ul><ul><li></message> </li></ul><ul><li><message name=&quot;empty&quot;/> </li></ul><ul><li><portType name=&quot;PT&quot;> </li></ul><ul><li><operation name=&quot; myMethod &quot;> </li></ul><ul><li><input message=&quot; myMethodRequest &quot;/> </li></ul><ul><li><output message=&quot;empty&quot;/> </li></ul><ul><li></operation> </li></ul><ul><li></portType> </li></ul>
  56. 56. 3 document /encoded <ul><li>SOAP 文档内容 </li></ul><ul><li><soap:envelope> </li></ul><ul><li><soap:body> </li></ul><ul><li><xElement xsi:type =&quot; xsd:int &quot;>5</xElement> </li></ul><ul><li></soap:body> </li></ul><ul><li></soap:envelope> </li></ul>
  57. 57. 4 . document /literal <ul><li>WSDL 文档内容 </li></ul><ul><li><type> </li></ul><ul><li><schema> </li></ul><ul><li><element name=&quot;xElement&quot; type=&quot;xsd:int&quot;/> </li></ul><ul><li></schema> </li></ul><ul><li></types> </li></ul><ul><li><message name=&quot; myMethodRequest &quot;> </li></ul><ul><li><part name=&quot;x&quot; element=&quot;xElement&quot;/> </li></ul><ul><li></message> </li></ul><ul><li><message name=&quot;empty&quot;/> </li></ul><ul><li><portType name=&quot;PT&quot;> </li></ul><ul><li><operation name=&quot; myMethod &quot;> </li></ul><ul><li><input message=&quot; myMethodRequest &quot;/> </li></ul><ul><li><output message=&quot;empty&quot;/> </li></ul><ul><li></operation> </li></ul><ul><li></portType> </li></ul>
  58. 58. 4 . document /literal <ul><li>SOAP 文档内容 </li></ul><ul><li><soap:envelope> </li></ul><ul><li><soap:body> </li></ul><ul><li><xElement>5</xElement> </li></ul><ul><li></soap:body> </li></ul><ul><li></soap:envelope> </li></ul>
  59. 59. 5 document / literal-wrap <ul><li>WSDL 文档 </li></ul><ul><li><types> </li></ul><ul><li><schema> </li></ul><ul><li><element name=&quot; myMethod &quot;/> </li></ul><ul><li><complexType> </li></ul><ul><li><sequence> </li></ul><ul><li><element name=&quot;x&quot; type=&quot;xsd:int&quot;/> </li></ul><ul><li></sequence> </li></ul><ul><li></complexType> </li></ul><ul><li></element> </li></ul><ul><li></schema> </li></ul><ul><li></types> </li></ul><ul><li><message name=&quot;myMethodRequest&quot;> </li></ul><ul><li><part name=&quot; </li></ul><ul><li>parameters&quot; element=&quot; myMethod &quot;/> </li></ul><ul><li></message> </li></ul><ul><li><message name=&quot;empty&quot;/> </li></ul><ul><li><portType name=&quot;PT&quot;> </li></ul><ul><li><operation name=&quot; myMethod &quot;> </li></ul><ul><li><input message=&quot;myMethodRequest&quot;/> </li></ul><ul><li><output message=&quot;empty&quot;/> </li></ul><ul><li></operation> </li></ul><ul><li></portType> </li></ul>
  60. 60. 5 document / literal-wrap <ul><li>SOAP 文档 </li></ul><ul><li><soap:envelope> </li></ul><ul><li><soap:body> </li></ul><ul><li><myMethod> </li></ul><ul><li><x>5</x> </li></ul><ul><li></myMethod> </li></ul><ul><li></soap:body> </li></ul><ul><li></soap:envelope> </li></ul>

×