WSDL 的内部运作

 wsdl是 XML 中相当于简历的等同物 -- 描述 Web 服务做什么,它在哪里及如何调用它。

 让我们来查看一下 WSDL 文档中的每一部分,从 <definitions> 段开始。

<definitions>
<definitions> 元素包括一个或者多个服务的定义。大多数情况下,一个 WSDL 文件定 义一个单独的服务。

<definitions> 标记后通常紧跟着以下属性的声明:

 name:这个属性是可选的,用来说明服务的主要目的。
 targetNamespace:这个属性定义了关于服务信息的逻辑命名空间,并且各服务的属性值通常是不同的。这个属性在稍后会作更进一步的讨论。
 xmlns:tns:在许多的 WSDL 文件中,这个命名空间并不出现(包括我们的示例),但是 很快就会流行起来的。如果出现,则被设置成targetNamespace 的值。这个属性在稍后 会作更进一步的讨论。
 xmlns:soap 和 xmlns:xsd:它们是标准命名空间的定义,在以后的 WSDL 文档中被用作指定特定的 SOAP 的信息和数据类型。
 xmlns:缺省的 WSDL 文档的命名空间,被设置到 http://schemas.xmlsoap.org/wsdl/。所有的 WSDL 标记,像<definitions>、<message> 和 <service> 都驻留在这个命名空间之内。

 

在 <definitions> 之中,有三个概念性的部分:

<message> 和 <portType>: 服务提供什么操作。
<binding>: 操作怎样被调用。
<service>: 服务位于哪里。

除此之外,服务所使用的任何复杂数据类型必须在一个可选的 <types> 部分里面被定义,而 <types> 部分必须直接放在 <message> 部分之前。

 

让我们详细的看看每一个部分。

<message> 和 <portType>
一个 <message> 对应在调用者和服务之间传递的一条信息。一个规则的有往返的远程方法调用有两条消息,一条负责请求,一条负责响应。每一个<message> 可以没有任何部分,或者有多个部分,每个部分都有一个名字和可选的类型。当 WSDL 描述一个对象时
每一个部分映射到一个方法调用的参数上。如果一个方法返回为 void,那么响应就是一条空信息。

一个 <portType> 对应一套单个或多个操作,而一个 <operation> 定义了一个特定的输入/输出消息序列。每一个输入/输出的消息属性必须对应前面定义过的 <message> 的名称。如果一个操作只指定了输入,则只是单向操作。输出后面紧跟着输入则是请求-响应 (solicit-response) 操作,单一的输入是一个通告。当 WSDL 描述一个对象时,每一个 <operation> 映射一个方法并且每一个 <portType> 映射一个 Java 接口或类。在这个示例中,getRate 操作接受了一个 getRateRequest 消息作为它的输入,并返回一个 getRateResponse 消息作为它的输出。

<binding>
<binding> 对应于用特定的协议 -- 如 SOAP 或者 CORBA -- 来实现的 <portType> 。绑定的类型属性必须对应定义过的<portType> 的名称。因为 WSDL 是中性的协议,所以您可以指定 SOAP、CORBA、DCOM 和其它的标准协议的绑定。如果一个服务支持不止一个协议,WSDL 应该对每一个它支持的协议都包含一个 <binding>。在示例中,<binding> 部分表明使用标准的 SOAP 编码进行的 RPC 到 HTTP 的通信。也请注意 soapAction (在最后的部分描述)在这个示例中的设置是设置成空串,并且服务的 URI 被设置成 "urn:xmethods-CurrencyExchange"。

<service>
一个<service> 是一个端口集,而 <port> 代表了在特定端点进行特定绑定的可用性。端口的绑定属性必须对应于前面定义过<binding> 的名称。在示例中,通过 Xmethods 网站的 CurrentExchangeBinding 绑定可访问 <service>。

<documentation>
任何 WSDL 元素可以声明一个可选的 <documentation> 元素,其中包含人们可读的关于
那个元素的信息。
在示例中,唯一有文档描述的元素是 <service>。对于其他的元素,
例如独立操作,有文档描述也是很普通的。

 

目标命名空间

由于 WSDL 文件能够导入其它的 WSDL 文件,因此总有可能发生名字冲突的时候。所以,最晚拿到的 WSDL 文件需要在它们的 <definitions> 部分里面定义 targetNamespace 和 xml:tns 的属性,在那里 targetNamespace 被设成对应于特定的WSDL(通常是原始的WSDL 文件的名称)的一个唯一URL。完成此功能的 WSDL 生成器利用 tns: 对部分与部分之间的引用做范围界定,来防止相同名字冲突。举一个示例,在清单 8 里,操作声明使用 tns: 前缀,明确地把它使用的消息的范围界定在一个特定的 WSDL 文件中。
图 8:使用 tns: 前缀
<portType name = "CurrencyExchangePortType">
<operation name = "getRate">
<input message = "tns:getRateRequest" name = "getRate"/>
<output message = "tns:getRateResponse" name = "getRateResponse"/>
</operation>
</portType>

很可能所有的 WSDL 工具包很快都会采用这种方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值