33.1.2 理解Web服务

Web服务是通过Internet可供使用的应用程序接口。我们可以将Web服务看作是一个通过Web开放了其公有方法的类。现在,Web服务随处可见,而且商业领域的一些著名企业也正在通过Web服务逐步开放它们的功能。

例如,Google、Amazon、eBay和PayPal现在就可以提供一系列的Web服务。在学习了本章关于如何创建一个能够访问Amazon接口的客户端后,我们会发现创建Google的客户端也是非常简单而又直观的。可以在http://code.google.com/apis/找到更多信息。

在如下站点给出了不断发展的公用Web服务列表:http://www.xmethods.net。

在这种远程函数调用方法中,还涉及了一些核心协议。最重要的两个协议是SOAP和WSDL。

1.SOAP

SOAP是一个以请求和响应为驱动的消息传递协议,它允许客户端调用Web服务,服务器对客户端的调用进行响应。每一个SOAP消息,无论是请求的还是响应的,都是一个简单的XML文档。程序清单33-2给出了一个我们可能发送给Amazon的SOAP示例请求。事实上,这个请求产生的XML响应如程序清单33-1所示。

程序清单33-2 一个基于ASIN的SOAP搜索请求


<SOAP-ENV:Envelope>

<SOAP-ENV:Body>

<m:ItemLookup>

<m:Request>

<m:AssociateTag>webservices-20</m:AssociateTag>

<m:IdType>ASIN</m:IdType>

<m:ItemId>0672317842</m:ItemId>

<m:AWSAccessKeyId>0XKKZBBJHE7GNBWF2ZG2</m:AWSAccessKeyId>

<m:ResponseGroup>Similarities</m:ResponseGroup>

<m:ResponseGroup>Small</m:ResponseGroup>

</m:Request>

</m:ItemLookup>

</SOAP-ENV:Body>


SOAP消息以一个XML文档的声明为开始。所有SOAP消息的根元素是SOAP“信封”。在这个“信封”中,我们可以找到包含真正请求的Body元素。

这个请求是一个ItemLookup,在这个例子中,它请求Amazon服务器在其数据库中基于ASIN(表示Amazon.com标准条目号)搜索特定项。这个号码是Amazon数据库中每一个产品的唯一标识符。

我们可以将ItemLookup看作是对一个远程计算机的函数调用,而且包含在该元素中的所有元素和属性就是我们传递给这个函数的参数。在这个例子中,通过IdType元素,我们传递了"ASIN"参数,而真正的ASIN值(0672317842)通过ItemId元素进行了传递。这个ASIN是本书第一版的唯一标识符。我们还需要传递另一个参数,那就是AssociateTag,,这是你的Amazon会员ID;此外,还需要的参数有:希望的响应类型(通过ResponseGroup元素);以及AWSAccessKeyId——Amazon分配的开发人员令牌。

这个请求的响应非常类似于程序清单33-1中的XML文档,但是它是封闭在一个SOAP信封中的。

当使用SOAP时,无论使用何种编程语言,通常要生成SOAP请求并且使用SOAP库通过程序来解释响应。这样做是非常不错的,因为它可以节省大量手动构建SOAP请求并解释响应所需的操作。

2.WSDL

WSDL是Web服务描述语言的缩写(通常,这个词的发音是"wiz-dul")。这个协议是用来描述特定Web站点上可供使用的接口的。如果想了解用来描述本章中使用的Amazon站点所提供Web服务的WSDL文档,可以访问http://soap.amazon.com/schemas2/AmazonWebServices.wsdl。

如果点击这个链接,将发现WSDL文档明显比SOAP消息要复杂。如果让我们选择的话,肯定会选择使用程序来生成请求并解释响应。

如果希望了解更多关于WSDL的内容,可以访问如下URL:http://www.w3.org/TR/wsdl20/。