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对象。