跳水失误:用 PHP 创建 Amazon 店面,第 1 部分: 用 Amazon ECS 获得内容

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 21:11:56

用 PHP 创建 Amazon 店面,第 1 部分: 用 Amazon ECS 获得内容

如何构建店面并显示商品

第 1 页, 总 共 12 页
文档选项

将此页作为电子邮件发送

样例代码


对本教程的评价

帮助我们改进这些内容


级别: 中级

Tyler Anderson , 自由撰稿人, Stexar 公司

2005 年 12 月 19 日

这是使用 PHP 和 Amazon 电子商务服务(ECS)建设 Amazon 店面的两部分教程的第一部分。建设的店面允许购物者查看列表中显示的商品,或者在商店中搜索特定商品。第 2 部分将介绍购物车、推荐服务以及建设专卖店。

开始之前

这个教程面向的是对于创建店面、自动连接 Amazon Web 服务并显示结果有兴趣的程序员。这个教程假设读者熟悉基本的 PHP 概念,包括 forwhile 循环,以及表单处理。如果对自己的 PHP 能力没把握,有许多优秀的教程可以帮助您达到要求(请参阅 参考资料)。

您应当熟悉 Amazon Web 服务,在 developerWorks 的 “Boost application development with Amazon Web Service” 系列文章中介绍了它(请参阅 参考资料)。

关于本系列

在这个两部分的系列中,我们要用 PHP 创建一个 Amazon 购物车。第 1 部分将讨论店面的架构,通过商品搜索请求与 Amazon Web 服务通信,显示选项并浏览商品分类。我们还将创建一个搜索框。

第 2 部分将讨论购物车的创建、添加商品和修改,这个购物车将使用叫作购物车请求的技术完全保存在 Amazon 的服务器上。我们将介绍构建藏品商店和向购物者提供浏览类似商品的能力。



回页首

关于本教程

我们将构建一个 Amazon 店面,包含分类链接和搜索框,允许购物者浏览商店中的商品目录。与多数 PHP 应用程序不同,这个程序不需要本地数据库,因为数据库保存在 Amazon 的服务器上。所以,这个教程严重地依赖简单对象访问协议(SOAP),这个 Web 服务协议用 XML 组织信息。Web 服务是应用程序(例如在这个教程中要构建的 PHP 应用程序)与中央服务器通信以获取信息的一种方式。

通过 Amazon 电子商务服务(ECS),可以从购物者选择的分类中获得和显示内容。当选中一个分类时,将创建参数,指明这个分类,收集相关信息,并启动 SOAP 客户。SOAP 客户会接受参数,形成 XML 文档,并把 XML 文档转交给 SOAP 服务器。Amazon 服务器访问自己的数据库,生成 XML 文档,里面包含的商品与参数匹配。最后,服务器把 XML 文档返回给 SOAP 客户,SOAP 客户再把文档解析成数据结构,从数据结构中可以提取出请求的数据。

 

获得内容

如何构建店面并显示商品

第 2 页, 总 共 12 页
文档选项

将此页作为电子邮件发送

样例代码


对本教程的评价

帮助我们改进这些内容


概述

Amazon ECS

Amazon 电子商务服务(ECS)允许任何人连接到它巨大的商品目录,在 Web 站点上显示商品,把购物者引导到 Amazon 进行销售,并得到销售的佣金。任何人都可以做这件事。需要做的只是遵守 Amazon 的应用程序编程接口(API)。就像 Amazon 说的“这就行了”。您的程序将成为一个Web 站点,在一个或多个分类中为 Amazon 的产品做广告、销售它的产品,得到每笔介绍成交的佣金。您不需要屯积商品或处理订单,唯一的责任就是维护好您的代码。

在这篇教程中,除了通过 PHP 使用 Amazon ECS,还将设计店面的架构,并向它添加功能,允许在分类中进行浏览和搜索特定商品。



回页首

与 Amazon ECS 通信

我们将使用 PHP 和 Web 服务,通过 SOAP 与 Amazon 通信。Web 服务(例如 Amazon ECS)允许程序员访问服务。在这个示例中,我们将连接到 Amazon ECS 去获取关于产品的信息。清单 1 显示了一条示例 SOAP 消息。


清单 1. 示例 SOAP 消息
    ...  

SOAP 消息看起来就是这个样子。在 PHP 和 Web 服务 一节中,将学习如何使用 SOAP 消息制作到 SOAP 服务器的请求和接收来自 SOAP 服务器的请求。



回页首

店面

流行的店面拥有干净、简单的布局。在这份教程中,我们将设计一个基本的店面,在样式上比较朴素,这样就可以把精力集中在使店面运行的机械部分了。完成的产品将有一个容纳分类和搜索框的侧面板,在右侧的主内容区显示商品(请参阅图 1)。


图 1. 最后的应用程序



回页首

分类

多数在线商店只有一个或很少的分类。这份教程的店面将包含较少几个分类,但是在构建自己的店面时,可以喜欢多少分类就建立多少。分类被作为向 Amazon ECS 发送的 SOAP 请求中的信息,ECS 会返回与选中的分类匹配的商品。

可用的分类如图 2 所示。


图 2. 可用的分类

上面显示的分类是 SearchIndex 可能的值,我们将用它来搜索商品。



回页首

商品

默认情况下,Amazon 的分类包含充满商品的数百页。购物者需要缩小他们的搜索范围,以便找到他们想要的东西。我们将要设计的商品搜索功能会在分类内搜索商品,并把结果显示给购物者,显示的结果与 Amazon 上显示的商品类似。请参阅图 3 和图 4。


图 3. 最终应用程序在 Baby 分类中显示的商品


图 4. Amazon 上在 Baby 分类中显示的商品

请注意在图 4 中的前三项是相同的。不是所有商品都完全以同样顺序出现。但是,显示的商品是一样的。

获得内容

如何构建店面并显示商品

第 3 页, 总 共 12 页
文档选项

将此页作为电子邮件发送

样例代码


对本教程的评价

帮助我们改进这些内容


什么是 Amazon ECS?

Amazon 电子商务服务(ECS)允许得到 Amazon 信息的访问权,所有的信息与浏览 Amazon 时发现的信息一样。这一节将研究从 Amazon 检索信息的方法。

请求类型

搜索商品或其他内容有多种方法。在这里,我们只集中在 ItemSearch 上。第 2 部分还会使用 ItemSearch,以及 ItemLookupCartCreateCartAddCartModifyCartClearCartGet

下面是所有可能的请求的列表:

  • BrowseNodeLookup —— 返回 Amazon 特定产品区域的信息。
  • CartAdd —— 向购物车添加商品。
  • CartClear —— 删除购物车的所有内容。
  • CartCreate —— 创建时带有一件指定的商品,这个请求创建一辆新购物车。
  • CartGet —— 检索购物车的内容。
  • CartModify —— 用来修改购物车中商品的数量。把数量设为 0 会把商品从购物车删除。商品也可以移动到已经保存的购物车或者从中移出。
  • CustomerContentLookup —— 用来检索特定 Amazon 客户编写的可以公开得到的内容。
  • CustomerContentSearch —— 允许按照姓名或电子邮件地址搜索 Amazon 客户。
  • Help —— 用来检索关于使用 Amazon ECS 进行开发的信息。
  • ItemLookup —— 允许通过使用评论、相似性等信息检索最多 10 件产品。
  • ItemSearch —— 用来根据分类和关键字来搜索产品。
  • ListLookup —— 允许从特定列表检索所有商品。
  • ListSearch —— 允许搜索祝福列表、婴儿库或婚姻库。
  • SellerListingLookup —— 允许查询 Amazon Shops and Marketplace 的产品。
  • SellerListingSearch —— 允许搜索 Amazon Shops and Marketplace 的清单。
  • SellerLookup —— 允许检索关于特定销售人员的信息,包括客户反馈评级、位置等等。
  • SimilarityLookup —— 允许检索某个产品的类似商品。
  • TransactionLookup —— 允许检索 Amazon 客户所做交易状态的有限信息。


回页首

理解参数

每个请求都要求有合适的参数,好让 Amazon ECS 正确地处理请求。这个系列中使用的参数和它们的说明是:

  • Service —— 这个参数总是 AWSECommerceService
  • SubscriptionId —— 来自 Amazon 的开发人员令牌。
  • AssociateTag —— 来自 Amazon 的合伙人 ID。
  • Operation —— 要执行的操作或请求的类型。通常,只是把 Request 添加到每个请求类型。对于 ItemSearch 这个请求类型,操作将是 ItemSearchRequest。对于 ItemLookup,操作将是 ItemLookupRequest,如此类推。
  • ResponseGroup —— 这是个重要的参数,因为它告诉 Amazon 需要多少信息:从 Small(少量)、Medium(中量)和 Large(大量)到可用的 XML 元素的特定部分。

下面是一些可用的响应组:

  • Accessories —— 对于列表中有附件的产品,返回每件产品的附件商品列表。
  • Cart —— 返回购物车标识符,以及特定于每件产品的信息。
  • Images —— 返回某件产品拥有的全部图片的 URL。
  • Offers —— 返回列表中每件产品的供货信息。
  • Small —— 为列表中的每件商品提供“少量”信息。
  • Medium —— 为列表中的每件商品提供“中量”信息。
  • Large —— 为列表中的每件商品提供“大量”信息。


回页首

SOAP 与 REST

服务器为每个请求类型返回的数据都是相同的。但是,请求的设置和使用都有不同。REST 请求最简单,因为它们只是长长的 URL,URL 中包含每个商品的变量和它们的值 —— 非常像 PHP 中的 GET 请求。

另一方面,SOAP 请求更复杂,因此也就更强大。它们是通过 HTTP 传递给 SOAP 服务器的 XML 文档。SOAP 请求比 GET 请求更强大,因为它们能接受更多参数,而且多个请求也可以绑定在一个 SOAP XML 文档中,这样就支持同时请求。而且,SOAP 请求拥有优先级,这就增强了商店整体的响应性。

在这份教程中将使用 REST 请求来研究服务器返回的数据。在最终应用程序中(在第 2 部分中)使用 SOAP 请求,因为它们允许做的工作比简单的 REST 请求多得多。



回页首

简单 REST 请求

在这里将执行 REST 请求来研究返回的数据是什么。进行 ItemSearch 查询就是在这份教程后面要做的事。首先,需要设置参数。

服务的值是 AWSECommerceService,操作是 ItemSearchRequestResponseGroupSmallSubscriptionId 是开发人员令牌,AssociateTag 是 Amazon 合伙人 ID。通过 Sporting Goods 分类进行搜索,所以 SearchIndex 是 SportingGoods,具体的搜索是高尔夫俱乐部,所以 Keywords 是“golf clubs”。下面是使用的 URL,如清单 2 所示。


清单 2. REST 请求的 URL
http://webservices.amazon.com/onca/xml?Service=AWSECommerceService    &SubscriptionId=01AJBKQ38K8HM2R33Q82&Operation=ItemSearch    &ResponseGroup=Small&AssociateTag=scubanecessit-20    &SearchIndex=SportingGoods&Keywords=golf%20clubs

Amazon ECS 现在会返回包含搜索的商品信息的 XML 文档。



回页首

REST 响应

因为响应太大,所以在这里只能显示一部分。但是,自己可以把浏览器指向清单 2 中的 URL,查看完整的响应。清单 3 显示了 REST 响应的一小段。

这就是商品数组开始的地方。它把搜索商品的内容传回发送者。第一个 元素开始的是 Amazon ECS 发送的响应中第一个商品的信息。它显示了 ASIN、商品 ID、URL(如果是由浏览器指向的),还会显示产品的详细信息。如果请求了小型 ResponseGroup,它还会显示基本的属性,例如商品的标题。



回页首

理解 Amazon 的 WSDL 文件

Web 服务描述语言(WSDL)文件定义了 Web 服务需要的信息以及它应当返回的信息。这样,不需要去琢磨需要发送什么信息、向哪儿发送信息、从响应中能得到什么,就可以构建自己的应用程序。

Amazon 的 WSDL 文件 描述了可用的命令以及可能的查询和搜索语法。

请考虑上面文件中的 ItemSearch 项,如 清单 4 所示。

对于 REST 请求,清单 5 中显示的元素只是被插入 ItemSearch 元素(清单 3)。AWSECommerceService 服务定义了应当在哪里进行请求,它就是在 REST 响应面板中的 GET 请求的 URL 中发送的内容。


清单 5. ItemSearchRequest 项
    ...

WSDL 文件定义了 SOAP 请求和响应以及 REST 响应的结构。(REST 请求就是带有编码过的参数的 URL。)请注意,清单 5 中名为 Request 的元素定义了可以产生的请求类型,是 ItemSearchRequest 请求;而且清单 5 中包含的请求结构把 ItemSearch 请求和 ItemSearchRequest 操作连接在一起。在继续阅读本教程时,或者在读完这份教程并准备构建自己的应用程序时,可以参考这个文件。

获得内容

如何构建店面并显示商品

第 4 页, 总 共 12 页
文档选项

将此页作为电子邮件发送

样例代码


对本教程的评价

帮助我们改进这些内容


PHP 和 Web 服务

在这一节,将学习如何通过 PHP 发送和接收简单 SOAP 请求,以及如何 PHP 从响应中提取数据。

创建 SOAP 请求

要创建 SOAP 请求,需要设置参数。因为 SOAP 比 REST 复杂,所以将从一个简单示例开始:产品库存检查器。XML 文档如清单 6 所示。


清单 6. 产品库存检查器的 XML 格式的 SOAP 请求
              UWHD0023      

清单 6 中的代码是 SOAP 请求在 XML 中看起来的样子。它指定了一个带有空 HeaderEnvelopeBody 包含要发送的参数。PHP 现在可以通过 HTTP 向 SOAP 服务器发送这个请求。



回页首

用 PHP 创建 SOAP 客户

要创建 SOAP 客户,可以利用 PHP 内置的 SOAP 功能:


然后,把请求传递给 SOAP 服务器。



回页首

用 PHP 传递 SOAP 请求

现在已经创建了客户,需要设置 SOAP 参数并调用示例函数 InStockCheck,如清单 7 所示。


清单 7. 设置参数并发送 SOAP 请求
$params = array( ‘ItemId‘ => UWHD0023);$client->InStockCheck($params);...?>

以上代码把 SOAP 请求发送到 WSDL 文件中指定的服务器,URL 就是 REST 请求中使用的 URL。现在转到 SOAP 响应。



回页首

SOAP 响应

SOAP 响应也是 XML 文档 (请参阅清单 8)。


清单 8. 产品库存检查器的 XML 格式的 SOAP 响应
              15      

生成的数据结构在 InStockQuantity 中包含对请求的回答。下面,将用 PHP 接收和提取需要的数据。



回页首

用 PHP 从响应中接收和提取数据

用清单 9 中的 PHP 代码捕获响应。


清单 9. 捕获响应
...$client-$result = $client-...?>

只要把变量 $result 设置为 InStockCheck 的 SOAP 调用即可。要提取回答 InStockQuantity,请使用清单 10 中的代码。


清单 10. 提取答案
...$result = $client->lInStockCheck($params);$answer = $result->lInStockQuantity;?>

现在了解了如何传输和接收简单 SOAP 请求和响应。稍后,将制作带有层次结构的更复杂的 SOAP 请求。



回页首

处理故障

故障可能由于各种原因而发生。要想自行捕捉故障而不使用异常,并把故障显示到屏幕上,请使用以下 PHP 代码。


清单 11. 处理 SOAP 故障
...$result = $client->InStockCheck($params);$client = new    SoapClient("http://webservices.example.com/services/example.wsdl");$result = $client->InStockCheck($params);if(is_soap_fault($result)){    print("A fault occurred: " . $result->faultstring);}else{    $answer = $result->InStockQuantity;}?>

如果您这边或服务器端发生了问题,SOAP 响应中就会返回故障,那么使用上面的代码就可以得到通知。故障看起来就像正常的 SOAP 响应一样。但是,变量 faultstring 包含故障发生的原因。

获得内容

如何构建店面并显示商品

第 5 页, 总 共 12 页
文档选项

将此页作为电子邮件发送

样例代码


对本教程的评价

帮助我们改进这些内容


设计店面架构

这一节将讨论店面架构的设计。它将指导 Web 站点模板的创建,模板包括:显示的标题,分类使用的侧面板,在分类中进行搜索的搜索框,以及页面底部的页脚。

处理点:storeFront.php

既然已经介绍了 Web 服务,现在就开始设计店面。为店面创建一个根目录,并创建一个文件:storeFront.php。开始编写它的代码,如清单 12 所示。


清单 12. 处理请求和显示店面
Welcome to TylerCo., where you will find great value and great service!Guaranteed!

Please browse the products on our Web site by clicking on one of the categories to the left");...require(‘footer.php‘);?>


上面的代码介绍店面。随后当选择了某个分类时,就会调用方法与 Amazon ECS 连接,并显示返回的分类商品或与搜索条件对应的商品。



回页首

主链接和标题

storeFront.php 这个文件用来转发和接收应用程序的所有请求,这是创建店面要显示的余下内容所需要的。创建名为 header.php 的文件,把它放到 storeFront.php 的同一目录中。开始编写它的代码,如清单 13 所示。


清单 13. 主链接和标题
‘.$title.‘

在这里输出了标题,而且如果需要的话,还会输出主链接。如果 Web 浏览器被指向 storeFront.php,而不是某个关键字或分类,那么只会显示 Home 这个文本。但是,如果正在浏览分类,那么会显示这个链接,在链接上点击,会清空 GET 字符串中的变量并回到主页。



回页首

侧面板:分类

接下来,需要一些浏览用的分类。我们从五个分类开始:Baby、Computers、Outdoor Living、Software 和 Sporting Goods。继续处理 header.php,添加如清单 14 所示的代码。


清单 14. 显示分类链接
...print(‘

清单 16 的 HTML 代码会显示一个搜索框。一旦按下了 Search 按钮,就会提交输入的关键字,同时当前 displayCat 和分类变量也会作为隐含输入提交。这将允许应用程序处理数据,并把适当的商品作为结果显示出来。

请点击某个分类链接,查看带有搜索框的当前店面,如图 6 所示。


图 6. 显示搜索框

搜索框在左侧面板中显示,有一个按钮。在 搜索商品 一节中将介绍在分类中搜索商品。现在转入主内容区域。



回页首


主内容区域:设置和内容

到了教程的这一部分,侧面板即将完成。在第 2 部分中还会添加其他一些东西,所以请一定要阅读那一部分。

现在,要设置主内容区域,稍后将在这里显示从 Amazon 返回的商品。这部分代码会结束侧面板并开始主内容区域:

print(‘
‘);if(!isset($_GET[‘keyword‘]) && !isset($_GET[‘category‘])){ print("Home");}else{ print("Home");}...

‘.$title.‘

< /center>

清单 14 创建的侧面板将容纳分类链接。当客户点击其中一个分类时,会在 URL 中设置这个分类和 displayCat(要求显示当前分类的值)。这样,应用程序就能用 GET 数组处理变量并显示适当的商品和信息。

图 5 显示了具有分类链接的当前店面。


图 5. 显示分类链接

分类链接显示在左侧面板中。现在转到对在分类上点击的处理。

processGETString 将把当前变量放在 GET 数组中,根据店面中的每次点击添加变量的值。这很重要,这样客户每次在店面中点击时,他目前的数据就不会丢失。把这个函数放在 functions.php 中,如清单 15 所示。


清单 15. 处理和返回 URL 中编码的变量
function processGETString($vetoString=‘‘){    $string = ‘‘;    if($_GET[‘pagenum‘] != ‘‘ && strstr($vetoString, ‘pa‘) == ‘‘)        $string .= "&pagenum=".$_GET[‘pagenum‘];    if($_GET[‘keyword‘] != ‘‘ && strstr($vetoString, ‘ke‘) == ‘‘)        $string .= "&keyword=".$_GET[‘keyword‘];    if($_GET[‘category‘] != ‘‘ && strstr($vetoString, ‘ca‘) == ‘‘)        $string .= "&category=".$_GET[‘category‘];    if($_GET[‘displayCat‘] != ‘‘ && strstr($vetoString, ‘di‘) == ‘‘)        $string .= "&displayCat=".$_GET[‘displayCat‘];    return $string;}

这个函数把当前的所有变量合并成一个变量,用来创建链接,这样就可以把变量的值从一个链接传递到下一个链接。作为参数传递的 $vetoString 变量(值为 cadikepa)用作指示:如果这个变量存在,它的值就不被传播。这在用户想转换分类时很重要。使用 displayCat 可以显示新的分类。关键字和 pagenum 变量需要一起被丢弃。

请点击 Baby 分类,注意 URL 中的当前分类和 displayCat 值:

http://localhost.localdomain/amazon_ecs_part1/storeFront.php?   category=Baby&displayCat=Baby

现在点击 Computers 分类.

http://localhost.localdomain/amazon_ecs_part1/storeFront.php?  category=PCHardware&displayCat=Computers

可以看到旧的分类和 displayCat 值没有被传播。这是因为通过传递 ‘ca‘ 取消分类并且传递 ‘di‘ 取消 displayCatprocessGETString() 函数已经取消了它们。



回页首

侧面板:搜索框

现在已经设置了浏览分类的功能。接下来,要添加功能,创建一个搜索框,在当前分类中进行搜索,继续使用 header.php,如清单 16 所示。


清单 16. 显示搜索框
...
Categories
Baby
Computers
Outdoor Living
Software
Sporting Goods
 
‘);...
‘);if(isset($_GET[‘category‘])){ print(‘
Search within
this category
... ‘); print(‘
 
‘);...
‘);

主内容区域的内容是用来显示的。在做这件事之前,需要完成页脚。



回页首

页脚:站点信息

页脚是一个相当简单的文件,如果日后需要,可以做得更复杂。创建 footer.php 文件,并把它放在与 header.php 相同的目录中。把以下示例代码放在这个文件中,如清单 17 所示。


清单 17: 显示站点和版权信息

Copyright 2005, TylerCo.
Product/information and pictures Copyright Amazon

可以为自己的应用程序调整站点和版权信息。这就完成了店面。把浏览器指向 storeFront.php 后的示例输出如图 7 所示。


图 7. 完整的店面

店面现在应当包括标题、带有分类链接的侧面板,右侧是空的主内容区,页脚显示站点和版权信息。搜索框在这里不显示,因为还没有选择分类。

现在转到有趣的部分,开始从 Amazong 检索内容。

获得内容

如何构建店面并显示商品

第 6 页, 总 共 12 页
文档选项

将此页作为电子邮件发送

样例代码


对本教程的评价

帮助我们改进这些内容


浏览分类

既然店面已经设计完成,有了分类链接,现在是时候从 Amazon ECS 请求数据并显示返回的商品供客户浏览了。

从 GET 数据中检索当前分类

首先需要点击一个分类。先从点击 Sporting Goods 分类开始,然后在 storeFront.php 中处理,如清单 18 所示。


清单 18. 处理从 GET 数组得到的分类变量
...require(‘header.php‘);if($_GET[‘category‘] != ‘‘){    printCategoryItems();}else{    print("

Welcome to TylerCo., where you will find great value and great service!Guaranteed!

Please browse the products on our Web site by clicking on one of the categories to the left");}


这次,不是介绍店面,GET 数组中存在分类变量,这告诉应用程序选择了一个分类,应当调用 printCategoryItems()。要想看看清单 18 中的代码的作用,可以创建一个空函数 printCategoryItems(),并把它放在 functions.php 文件中。



回页首

检验选中的分类

已经选择一个分类后,需要做的是检验它是否店面中的有效分类。请在 functions.php 文件中创建以下函数,并把这个文件放在店面根目录中叫作 includes 的子目录中,如清单 19 所示。


清单 19. 检验选中的分类在店面中是否有效
define(TOKEN, "YourDeveloperTokenHere");define(ASSOCID, "YourAssociatesIdHere");function printCategoryItems(){...    $category = $_GET[‘category‘];    $displayCat = $_GET[‘displayCat‘];    switch($category){    case ‘Baby‘:    case ‘PCHardware‘:    case ‘OutdoorLiving‘:    case ‘Software‘:    case ‘SportingGoods‘:        $innerTitle = "$displayCat";        break;    default:        print("The $category category doesn‘t exist");        return;    }    if(isset($_GET[‘pagenum‘])){        $pagenum = $_GET[‘pagenum‘];    }    else{        $pagenum = "1";    }...

请在 storeFront.php 的顶部包含这个文件。

前两行定义了开发人员令牌和 Amazon 合伙人 ID。需要用从 Amazon 得到的实际值替换它们。如果分类无效,方法会返回,并通知客户。但是,如果分类有效,主内容区的标题就会变成用来显示分类的值,比起传递给 Amazon 的分类代码,这个值更具可读性。$pagenum 变量指示 Amazon 要返回哪页结果显示给客户。



回页首

设置参数

现在要设置发送给 Amazon ECS 的参数。在分类中搜索商品,要使用清单 20 所示的参数。


清单 20. 在分类中搜索商品的参数
...    $pagenum = "1";}$array = array(‘Operation‘ => ‘ItemSearchRequest‘,               ‘ItemPage‘ => $pagenum,               ‘SearchIndex‘ => $category,               ‘ResponseGroup‘ => ‘Medium‘,               ‘Keywords‘ => $displayCat);...

这个操作告诉 Amazon 要执行的是 ItemSearchRequest 查询,第一页是 1(由 ItemPage 指示)。SearchIndex 指定要搜索哪个分类,ResponseGroup 告诉 Amazon 需要多少信息。把 $displayCat 作为 Keywords,表明将查询整个分类。Keywords 参数是必需的,不能为空,所以包含分类显示名称的 $displayCat 变量将被用作关键字。



回页首

创建请求函数

请在 functions.php 中创建另一个函数,它将把我们的请求发送到 Amazon 并返回结果,如清单 21 所示。


清单 21. 向 Amazon ECS 发送请求并返回结果
function callSOAPFunction($function, $array){    $params = array(‘Service‘ => ‘AWSECommerceService‘,                    ‘AssociateTag‘ => ASSOCID,                    ‘SubscriptionId‘ => TOKEN,                    ‘Request‘ => array($array));    $client = newSoapClient("http://webservices.amazon.com/AWSECommerceService                  /AWSECommerceService.wsdl",                   array(‘exceptions‘ => 0));    return $client->__soapCall($function, array($params));}

这个函数获得一个函数名(由 WSDL 文件决定)以及一个参数数组(是在前面的面板中创建的)。然后就创建一个新 SOAP 客户,指向 Amazon 的 ECS WSDL 文件。参数 ‘exceptions‘ => 0 表明要手工处理异常。最后,向 Amazon 发送请求,指明要使用 WSDL 文件的函数 $function,以及参数数组 $params。如果有效,函数会返回一个数据结构,其中包含与搜索请求匹配的商品。



回页首

使用请求函数

现在可以通过调用 callSOAPFunction 制作请求。请把如清单 22 所示的代码添加到 printCategoryItems() 函数中。


清单 22. 调用 callSOAPFunction 并把结果保存在 $result 中
...               ‘ResponseGroup‘ => ‘Medium‘,               ‘Keywords‘ => $displayCat);$result = callSOAPFunction("ItemSearch", $array);...

结果现在保存在 $result 中,可以对它进行处理。



回页首

商品显示区

如果请求有效,每件事都工作正常,那么可以为客户显示商品的信息了。异常处理会在这一节最后介绍。添加代码到 printCategoryItems() 函数中,如清单 23 所示。


清单 23. 判断请求是否返回了商品,显示商品,以及页面导航
...    $result = callSOAPFunction("ItemSearch", $array);    $items = $result->Items->Item;    if($items){        printItemsSection($innerTitle, $items);        printPrevNextPage($result->Items->TotalPages, $pagenum);    }}<><>>>>>>>>>

首先,需要从返回的 SOAP 构造中检索商品数组:$items = $result->Items->Item。然后,如果 $items 存在,printItemsSection() 就输出所有商品,而 printPrevNextPage() 则会输出页面导航链接。

现在,需要遍历 $items 数组(如果它是数组的话)中的所有商品,或者打印出 $items(如果它不是数组的话)中唯一的商品。请参阅清单 24 中的代码,并把这个函数放在 functions.php 中。


清单 24. 输出商品区的标题并遍历所有商品
function printItemsSection($title, $items){    print("

$title

"); print(" "); if(is_array($items)){ foreach($items as $i){ printItem($i); } } else{ printItem($items); } print("
");}

对于每个商品元素,都调用 printItem() 函数。在这里把每个商品的 HTML 发送到 Web 浏览器。请把清单 25 所示的函数添加到 functions.php 中。


清单 25. 通过从 $i 变量检索商品数据,输出一件商品的信息
function printItem($i){    print("");    print("SmallImage->URL."‘>");    print(" ");    print("".$i->ItemAttributes->Title."<   /font>  ");    $price = $i->OfferSummary->LowestNewPrice->FormattedPrice;    print(" ");    print("Price: $price ");    print("   ");}

首先,显示 URL 为 $i->SmallImage->URL 的图片。然后是商品名称 $i->ItemAttributes->Title,后面跟着的是价格 $i->OfferSummary->LowestNewPrice->FormattedPrice。显示的每件商品实际上都是一个对象,拥有各种属性,与 SOAP 响应返回的 XML 文件对应。

图 8 显示了目前为止应用程序的浏览器输出示例。


图 8. 显示 Sporting Goods 分类的第一页

下面,需要导航链接,以便在分类的页面间进行导航。



回页首

显示页面导航链接

清单 23 中,有一个对 printPrevNextPage() 函数的引用。请把这个函数添加到 functions.php 中,如清单 26 所示。


清单 26. 为前一页和下一页链接检索数据,并显示它们
function printPrevNextPage($totalPages, $pagenum){    $previousPage = processPrevPage();    $nextPage = processNextPage($totalPages);        print("");    print("");    print("
"); print("$previousPagePage ".$pagenum); print(" of $totalPages$nextPage
"); print("
The above information came from "); print("Amazon.com. We make no guarantees to the accuracy of the above "); print("information.
");}

清单 26 中的函数调用两个子函数:processPrevPage()processNextPage()。这个函数接受两个返回的链接,并显示它们,这样就允许客户在页面间游历。它还显示了一个免责声明,表明 Web 站点的作者对于 Amazon 提供的信息不承担责任。

添加函数 processPrevPage()processNextPage() 的代码到 functions.php 中,如清单 27 和清单 28 所示。


清单 27. 计算前一页链接
function processPrevPage($pagenum){    if($pagenum > 1){        $previousPage = "


清单 28. 计算下一页链接
function processNextPage($totalPages, $pagenum){    if($pagenum < 300 && ($pagenum+1) <= $totalPages){        $nextPage = "

这两个清单中的代码处理前一页和下一页链接。请注意,processGETString() 的取消字符串会作为 pa 发送,从而确保当前的 pagenum 变量不会被传播。

现在介绍显示导航链接的代码。请参阅图 9 中显示导航链接的浏览器输出示例。


图 9. 在 Sporting Goods 分类第一页的底部显示导航链接



回页首

异常处理

既然已经制作了请求,现在重要的是检验没有发生错误。首先,创建函数 error(),如清单 29 所示。


清单 29. 显示出错信息
function error($msg, $err, $result){    print($msg);    if(is_array($err)){        $msg2 = $err[0]->Message;    }    else{        $msg2 = $err->Message;    }    print($msg2);    print_r($result->faultstring);    print("

"); print_r($result);}

这个函数将显示出错信息,表示发生了错误。请修改 printCategoryItems(),如清单 30 所示。这个代码检查是否出错,并使用 error() 函数。


清单 30. 测试 $result 判断是否出错,如果为真就显示出错信息
...$result = callSOAPFunction("ItemSearch", $array);if($result->faultstring || $result->Items->Request->Errors){    error("Your search return 0 results, or perhaps there was an   error processing your request. The returned XML file with   additional error information is as follows:

", $result->Items->Request->Errors->Error, $result);}else{ $items = $result->Items->Item; if($items){ printItemsSection($innerTitle, $items); printPrevNextPage($result->Items->TotalPages, $pagenum); }}...

在返回的 SOAP 构造中,有两个部分需要查看。一个是检查 $result->faultstring,如果没有出现故障,那么就需要查看 $result->Items->Request->Errors,检查是不是在请求中有错误。如果存在其中任何一种情况,都会显示出错信息;否则,代码会继续执行。

应用程序运行得很好!现在要转到搜索框,以便客户可以更好地缩小搜索范围。

获得内容

如何构建店面并显示商品

第 7 页, 总 共 12 页
文档选项

将此页作为电子邮件发送

样例代码


对本教程的评价

帮助我们改进这些内容


搜索商品

在这一节,将学习如何用搜索框设置正确的 SOAP 请求并在分类中检索特定商品,这样客户就可以把他们的搜索集中于少量商品。这一节会重用 浏览分类 一节中的许多代码,所以这一节的目标是展示如何动态地设置 Amazon 的商品搜索请求的参数。



检索搜索框提交的关键字

在检索提交的关键字之前,需要在搜索框中输入一些关键字。请在搜索框中输入“golf clubs”,如图 10 所示。




图 10. 在搜索框中输入关键字“golf clubs”

现在按下回车或点击 Search 按钮。现在可以添加 printCategoryItems() 函数,并用 GET 提交的关键字变量确定它的参数(请参阅清单 31)。


清单 31. 从 GET 数组检索关键字变量
function printCategoryItems(){    if(isset($_GET[‘keyword‘])){        $keyword = $_GET[‘keyword‘];        $innerTitle = "Results for ‘$keyword‘ ";    }    $category = $_GET[‘category‘];...

这将可以确定发送到 Amazon 的请求的参数。



回页首

确定搜索参数

要确定 $array 构造中创建的搜索参数,请参阅清单 32。


清单 32. 确定用来构造发送给 Amazon 的请求的 $array 参数
...    print("The $category category doesn‘t exist");    return;}$array = array(‘Operation‘ => ‘ItemSearchRequest‘,               ‘ItemPage‘ => $pagenum,               ‘SearchIndex‘ => $category,               ‘ResponseGroup‘ => ‘Medium‘,               ‘Keywords‘ => getKeyword($keyword, $displayCat));$result = callSOAPFunction("ItemSearch", $array);...

通过 getKeyword(),可以动态地修改传递给商品搜索请求的关键字。创建函数 getKeyword() 并把它放在 functions.php 文件中(请参阅清单 33)。


清单 33. 根据是否设置了 $keyword,返回需要的关键字
function getKeyword(){    if($_GET[‘keyword‘] == ‘‘){        return $_GET[‘displayCat‘];    }    else{        return $_GET[‘keyword‘];    }}

这样,如果设置了 keyword,就意味着客户使用搜索框进行搜索,那么关键字会通过清单 33 中的函数返回,并用作请求的 Keywords 的输入,这样就可以动态地修改请求的输入。

这就是动态地修改商品搜索请求输入参数所要做的全部工作。请参阅图 11 中在 Sporting Goods 分类中搜索 golf clubs 的示例输出。


图 11. 在 Sporting Goods 分类中搜索 golf clubs 的结果

请注意,搜索的结果与搜索框中输入的内容匹配!现在有了一个可以工作的 Web 站点,用户可以浏览 Amazon 特定分类中的商品,还可以在这些分类中搜索商品。

结束语

在这篇教程中,用 PHP 创建了 Amazon 店面,允许客户浏览分类,在这些分类中搜索特定商品。应用程序成功地向 Amazon ECS 提交请求并从 Amazon ECS 接收请求,允许在这个 Web 站点上显示产品。在这个系列的第 2 部分中,将为应用程序创建购物车,允许客户在 Amazon 上安全地购买商品 —— 并为您提供佣金。

下载

描述文件名称文件大小 下载方法Source code for the Amazon store, Part 1os-amazonphpstore1.zip3.5 KB FTP