<binding>
和<portType>
似乎都定义了一个操作及其消息。我不太明白,为什么它们都是必要的?
portType(类似于 Java 接口)
绑定
SOAP 绑定:
SOAP 绑定允许
document
或 rpc
style 与 encoding
或 literal
。 Encoding 指示如何将数据值编码为 XML 格式(这些规则指定如何将“某物”编码/序列化为 XML,然后如何从 XML 解码/反序列化回“某物”)。 Literal 表示数据根据模式进行序列化(这只是纯 XML 数据)。传输类型http、jms、smtp...HTTP GET 和 POST 绑定:
WSDL 包含 HTTP 1.1 的 GET 和 POST 动词的绑定,以便描述 Web 浏览器和网站之间的交互。
MIME 绑定: WSDL 包括一种将抽象类型绑定到某种 MIME 格式的具体消息的方法。
在 WSDL 2.0 中:
有用的链接
接口(wsdl:portType)
WSDL portType 元素定义一组操作(有时称为接口)。
操作元素包含输入和输出元素的组合。当有输出元件时,可能存在故障元件。这些元素的顺序定义了消息交换模式 (MEP)(单向、请求 - 响应等)
wsdl:绑定
WSDL 绑定元素描述了使用给定协议的特定端口类型的具体细节。
PortType 定义 Web 服务的抽象接口。
从概念上讲,它就像 Java 接口,因为它定义了抽象类型和相关方法。
在 WSDL 中,端口类型由绑定和服务元素实现,这些元素指示Web 服务实现
使用的协议、编码方案等
IE。绑定指定具体实现细节,并且本质上将 portType 映射到一组协议(HTTP 和 SOAP)消息样式(文档/RPC)和编码(文字)
现在区分清楚了吗?
端口类型
一个单个 Web 服务可以支持多个不同的协议。数据的结构取决于您用来调用 Web 服务的协议。因此,您需要一种方法将操作映射到可以访问它们的端点。 portType 元素负责此映射。
您可以为该 Web 服务可用的每个协议放置一个 portType 定义。例如,您可以使用单独的 portType 定义来使用 SOAP、HTTP-POST 和 HTTP-GET。操作名称是可从 Web 服务获得的方法。
装订
您可以定义最终用户如何绑定到可获取操作的端口。您可以通过使用该元素来完成此操作。
wsdl:portType 与 wsdl:operation 一起使用 也就是说,我们处于消息和 xml 的领域
但是 wsdl:binding 与soap:binding 和soap:operation 一起使用 即我们处于编码、地址、标头和 rpc 领域
例如来自:http://www.w3.org/TR/wsdl#_soap-b
<binding name="StockQuoteSoap" type="tns:StockQuotePortType">
<soap:binding style="document" transport="http://example.com/smtp"/>
<operation name="SubscribeToQuotes">
<input message="tns:SubscribeToQuotes">
<soap:body parts="body" use="literal"/>
<soap:header message="tns:SubscribeToQuotes" part="subscribeheader" use="literal"/>
......
<binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetTradePrice">
<soap:operation soapAction="http://example.com/GetTradePrice"/>
<input>
<soap:body use="encoded" namespace="http://example.com/stockquote"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
...
以及第 3.2 段中有关较低级别通信内容的所有可能的细节:
SOAP 绑定使用以下扩展元素扩展了 WSDL:
<definitions .... >
<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 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:body parts="nmtokens"? use="literal|encoded"
encodingStyle="uri-list"? namespace="uri"?>
<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>
<fault>*
<soap:fault name="nmtoken" use="literal|encoded"
encodingStyle="uri-list"? namespace="uri"?>
</fault>
</operation>
</binding>
<port .... >
<soap:address location="uri"/>
</port>
</definitions>