WSDL实例解析(1)
WSDL文档可以分为两部分。顶部分由抽象定义组成,而底部分则由具体描述组成。抽象部分以独立于平台和语言的方式定义SOAP消息,它们并不包含任何随 机器或语言而变的元素。这就定义了一系列服务,截然不同的应用都可以实现。具体部分,如数据的序列化则归入底部分,因为它包含具体的定义。在上述的文档元 素中,<types>、<message>、<portType>属于抽象定义 层,<binding>、<service>属于具体定义层。所有的抽象可以是单独存在于别的文件中,也可以从主文档中导入。
由于上面的事例XML较长,我们将其逐段分解讲解 WSDL文档的根元素:<definitions>
Xml代码
<definitions>定义了文档中用到的各个xml元素的namespace缩写,也界定了本文档自己的 targetNamespace="http://www.jsoso.com/wstest",这意味着其它的XML要引用当前XML中的元素时,要声 明这个namespace。注意xmlns:tns="http://www.jsoso.com/wstest"这个声明,它标示了使用tns这个前缀 指向自身的命名空间。 WSDL文档数据类型定义元素:<types> typesxsd:schemaxsd:import
WSDL文档消息体定义元素:< message > messagename="toSayHello"partname="userName"type="xsd:string"partmessagemessagename="toSayHelloResponse"partname="returnWord"type="xsd:string"messagename="sayHello"partname="person"type="tns:person"partname="arg1"type="xsd:string"messagename="sayHelloResponse"partname="personList"type="tns:personArray"messagename="HelloException"partname="fault"element="tns:HelloException" <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 > portTypename="Example"operationname="toSayHello"parameterOrder="userName"inputmessage="tns:toSayHello"inputoutputmessage="tns:toSayHelloResponse"outputoperationoperationname="sayHello"parameterOrder="personarg1"inputmessage="tns:sayHello"outputmessage="tns:sayHelloResponse"faultmessage="tns:HelloException"name="HelloException"faultportType 在<operation>元素中,name属性表示服务方法名,parameterOrder属性表示方法的参数顺序,使用空格符分割多个参 数,如:“parameterOrder="person arg1”。<operation>元素的子标签<input>表示输入参数说明,它引用<message>标签中的输入参 数。<output>表示输出参数说明,它引用<message>标签中的输出参数。<fault>标签在Java方法中的特别 用来表示异常(其它语言有对应的错误处理机制),它引用<message>标签中的错误参数。 WSDL绑定实现定义元素:< binding > bindingname="ExamplePortBinding"type="tns:Example"soap:binding
<binding>标签把前三部分的抽象定义具体化。 首先<binding>标签使用<soap:binding>的transport和style属性定义了Web Service的通讯协议HTTP和SOAP的请求风格RPC。其次<operation>子标签将portType中定义的 operation同SOAP的请求绑定,定义了操作名称soapAction,输出输入参数和异常的编码方式及命名空间。 WSDL服务地址绑定元素:< service > servicename="Example"portname="ExamplePort"binding="tns:ExamplePortBinding"soap:addresslocation="http://localhost:8080/hello"soap:addressportservice service是一套<port>元素。在一一对应形式下,每个<port>元素都和一个location关联。如果同一个<binding>有多个<port>元素与之关联,可以使用额外的URL地址作为替换。 一个WSDL文档中可以有多个<service>元素,而且多个<service>元素十分有用,其中之一就是可以根据目标URL来组织端口。在一个 WSDL文档中,<service>的name属性用来区分不同的service。在同一个service中,不同端口,使用端口的"name"属性区 分。 简单的描述了WSDL对SOAP协议的支持,以及在Web Service中的作用。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |