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