Wsdl基础 - littleboy12580/learning_python GitHub Wiki
WSDL 指网络服务描述语言 (Web Services Description Language),是一种使用 XML 编写的文档;WSDL 是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服务进行访问(类似远程过程调用)。WSDL首先对访问的操作和访问时使用的请求/响应消息进行抽象描述,然后将其绑定到具体的传输协议和消息格式上以最终定义具体部署的服务访问点。相关的具体部署的服务访问点通过组合就成为抽象的Web服务
WSDL 文档结构如下:
元素 | 定义 |
---|---|
<portType> | web service 执行的操作 |
<message> | web service 使用的消息 |
<types> | web service 使用的数据类型 |
<binding> | web service 使用的通信协议 |
以下是一个文档实例的基本结构:
<definitions>
<types>
definition of types........
</types>
<message>
definition of a message....
</message>
<portType>
definition of a port.......
</portType>
<binding>
definition of a binding....
</binding>
</definitions>
types是一个数据类型定义的容器,包含了所有在消息定义中需要的XML元素的类型定义;为了最大程度的平台中立性,WSDL 使用 XML Schema 语法来定义数据类型
message具体定义了在通信中使用的消息的数据结构,message元素包含了一组part元素,每个part元素都是最终消息的一个组成部分,每个part都会引用一个DataType来表示它的结构。part元素不支持嵌套(可以使用DataType来完成这方面的需要),都是并列出现
对于输入参数消息,part标签的element属性命名同webmethod方法名
对于输出参数消息,part标签的element属性命名同webmethod方法名 + response
portType>元素是最重要的 WSDL 元素;它可描述一个 web service可被执行的操作,以及相关的消息。
portType的name属性即为这个web services类的类名。这个标签下包含了所有的可用方法,每一个operation标签表示web services里的一个webmethod方法,operation标签的name属性是这个webmethod的方法名。
请求-响应是最普通的操作方法,不过 WSDL 定义了四种方法:
类型 | 定义 |
---|---|
One-way | 此操作可接受消息,但不会返回响应。 |
Request-response | 此操作可接受一个请求并会返回一个响应 |
Solicit-response | 此操作可发送一个请求,并会等待一个响应。 |
Notification | 此操作可发送一条消息,但不会等待响应。 |
一个one-way操作的例子如下:
<message name="newTermValues">
<part name="term" type="xs:string"/>
<part name="value" type="xs:string"/>
</message>
<portType name="glossaryTerms">
<operation name="setTerm">
<input name="newTerm" message="newTermValues"/>
</operation>
</portType >
Binding结构定义了某个PortType与某一种具体的网络传输协议或消息传输协议相绑定,从这一层次开始,描述的内容就与具体服务的部署相关了。比如可以将PortType与SOAP/HTTP绑定,也可以将PortType与MIME/SMTP相绑定等
下面是一个实例:
<message name="getTermRequest">
<part name="term" type="xs:string" />
</message>
<message name="getTermResponse">
<part name="value" type="xs:string" />
</message>
<portType name="glossaryTerms">
<operation name="getTerm">
<input message="getTermRequest" />
<output message="getTermResponse" />
</operation>
</portType>
<binding type="glossaryTerms" name="b1">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<operation>
<soap:operation
soapAction="http://example.com/getTerm" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>
</binding>
binding 元素有两个属性 - name 属性和 type 属性。
name 属性定义 binding 的名称,而 type 属性指向用于 binding 的端口,在这个例子中是 "glossaryTerms" 端口。
soap:binding 元素有两个属性 - style 属性和 transport 属性。
style 属性可取值 "rpc" 或 "document"。在这个例子中我们使用 document。transport 属性定义了要使用的 SOAP 协议。在这个例子中我们使用 HTTP。
operation 元素定义了每个端口提供的操作符。
对于每个操作,相应的 SOAP 行为都需要被定义。同时您必须如何对输入和输出进行编码。在这个例子中我们使用了 "literal"