33.3.5 使用SOAP发送和接收请求

下面,我们来了解SOAP版本的browseNodeSearch()函数。如下所示,我们将再次给出其代码:


$soapclient=new nusoap_client(

'http://ecs.amazonaws.com/AWSECommerceService/AWSECommerceService.wsdl',

'wsdl');

$soap_proxy=$soapclient->getProxy();

$request=array('Service'=>$this->Service,'Operation'=>$this->Operation,

'BrowseNode'=>$this->BrowseNode,'ResponseGroup'=>$this->ResponseGroup,

'SearchIndex'=>$this->SearchIndex,'Sort'=>$this->Sort,

'TotalPages'=>$this->TotalPages);

$parameters=array('AWSAccessKeyId'=>DEVTAG,'AssociateTag'=>ASSOCIATEID,

'Request'=>array($request));

//perform actual soap query

$result=$soap_proxy->ItemSearch($parameters);

if(isSOAPError($result)){

return false;

}

$this->totalResults=$result['TotalResults'];

foreach($result['Items']['Item']as$product){

$this->products[]=new Product($product);

}

unset($soapclient);


在以上代码中,没有其他特殊的函数——SOAP客户端为我们完成了所有“工作”。

我们以创建一个SOAP客户端实例为开始:


$soapclient=new nusoap_client(

'http://ecs.amazonaws.com/AWSECommerceService/AWSECommerceService.wsdl',

'wsdl');


这里,我们向客户端提供了两个参数。第一个就是服务的WSDL描述,而第二个参数可以告诉SOAP客户端这是一个WSDL URL。或者,我们也可以只提供一个参数:服务的终点,这是SOAP服务器的直接URL。

我们选择提供一个参数是有充分原因的,如下代码所示:


$soap_proxy=$soapclient->getProxy();


这一行代码将根据WSDL文档中的信息创建了一个类,这个类就是SOAP的代理,它拥有对应于Web服务中的方法。这可以使我们的工作变得简单一些。我们可以像与一个本地的PHP类进行交互一样与Web服务进行交互。

接下来,我们设置一个需要传递给browsenode查询的参数数组:


$request=array('Service'=>$this->Service,'Operation'=>$this->Operation,

'BrowseNode'=>$this->BrowseNode,'ResponseGroup'=>$this->ResponseGroup,

'SearchIndex'=>$this->SearchIndex,'Sort'=>$this->Sort,

'TotalPages'=>$this->TotalPages);


发送给该请求还需要其他两个元素:AWSAccessKeyID和and AssociateTag。这些元素以及$Request对象中的元素数组将保存在$parameters数组参数中。


$parameters=array('AWSAccessKeyId'=>DEVTAG,'AssociateTag'=>ASSOCIATEID,

'Request'=>array($request));


使用proxy类,你可以只调用Web服务的方法,将该参数数组传递给Web服务的方法:


$result=$soap_proxy->ItemSearch($parameters);


保存在$result中的数据是一个数组,我们可以将其直接保存为AmazonResultSet类的products数组中的一个Product对象。