'http://webservices.amazon.com', 'UK' => 'http://webservices.amazon.co.uk', 'DE' => 'http://webservices.amazon.de', 'JP' => 'http://webservices.amazon.co.jp', 'FR' => 'http://webservices.amazon.fr', 'CA' => 'http://webservices.amazon.ca'); /** * Reference to REST client object * * @var Zend_Rest_Client */ protected $_rest; /** * Constructs a new Amazon Web Services Client * * @param string $appId Developer's Amazon appid * @param string $countryCode Country code for Amazon service; may be US, UK, DE, JP, FR, CA * @throws Zend_Service_Exception * @return Zend_Service_Amazon */ public function __construct($appId, $countryCode = 'US') { $this->appId = (string) $appId; $countryCode = (string) $countryCode; if (!isset($this->_baseUriList[$countryCode])) { /** * @see Zend_Service_Exception */ require_once 'Zend/Service/Exception.php'; throw new Zend_Service_Exception("Unknown country code: $countryCode"); } /** * @see Zend_Rest_Client */ require_once 'Zend/Rest/Client.php'; $this->_rest = new Zend_Rest_Client($this->_baseUriList[$countryCode]); } /** * Search for Items * * @param array $options Options to use for the Search Query * @throws Zend_Service_Exception * @return Zend_Service_Amazon_ResultSet * @see http://www.amazon.com/gp/aws/sdk/main.html/102-9041115-9057709?s=AWSEcommerceService&v=2005-10-05&p=ApiReference/ItemSearchOperation */ public function itemSearch(array $options) { $defaultOptions = array('ResponseGroup' => 'Small'); $options = $this->_prepareOptions('ItemSearch', $options, $defaultOptions); $this->_rest->getHttpClient()->resetParameters(); $response = $this->_rest->restGet('/onca/xml', $options); if ($response->isError()) { /** * @see Zend_Service_Exception */ require_once 'Zend/Service/Exception.php'; throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . $response->getStatus()); } $dom = new DOMDocument(); $dom->loadXML($response->getBody()); self::_checkErrors($dom); /** * @see Zend_Service_Amazon_ResultSet */ require_once 'Zend/Service/Amazon/ResultSet.php'; return new Zend_Service_Amazon_ResultSet($dom); } /** * Look up item(s) by ASIN * * @param string $asin Amazon ASIN ID * @param array $options Query Options * @see http://www.amazon.com/gp/aws/sdk/main.html/102-9041115-9057709?s=AWSEcommerceService&v=2005-10-05&p=ApiReference/ItemLookupOperation * @throws Zend_Service_Exception * @return Zend_Service_Amazon_Item|Zend_Service_Amazon_ResultSet */ public function itemLookup($asin, array $options = array()) { $defaultOptions = array('IdType' => 'ASIN', 'ResponseGroup' => 'Small'); $options['ItemId'] = (string) $asin; $options = $this->_prepareOptions('ItemLookup', $options, $defaultOptions); $this->_rest->getHttpClient()->resetParameters(); $response = $this->_rest->restGet('/onca/xml', $options); if ($response->isError()) { /** * @see Zend_Service_Exception */ require_once 'Zend/Service/Exception.php'; throw new Zend_Service_Exception('An error occurred sending request. Status code: ' . $response->getStatus()); } $dom = new DOMDocument(); $dom->loadXML($response->getBody()); self::_checkErrors($dom); $xpath = new DOMXPath($dom); $xpath->registerNamespace('az', 'http://webservices.amazon.com/AWSECommerceService/2005-10-05'); $items = $xpath->query('//az:Items/az:Item'); if ($items->length == 1) { /** * @see Zend_Service_Amazon_Item */ require_once 'Zend/Service/Amazon/Item.php'; return new Zend_Service_Amazon_Item($items->item(0)); } /** * @see Zend_Service_Amazon_ResultSet */ require_once 'Zend/Service/Amazon/ResultSet.php'; return new Zend_Service_Amazon_ResultSet($dom); } /** * Returns a reference to the REST client * * @return Zend_Rest_Client */ public function getRestClient() { return $this->_rest; } /** * Prepare options for request * * @param string $query Action to perform * @param array $options User supplied options * @param array $defaultOptions Default options * @return array */ protected function _prepareOptions($query, array $options, array $defaultOptions) { $options['SubscriptionId'] = $this->appId; $options['Service'] = 'AWSECommerceService'; $options['Operation'] = (string) $query; // de-canonicalize out sort key if (isset($options['ResponseGroup'])) { $responseGroup = split(',', $options['ResponseGroup']); if (!in_array('Request', $responseGroup)) { $responseGroup[] = 'Request'; $options['ResponseGroup'] = implode(',', $responseGroup); } } $options = array_merge($defaultOptions, $options); return $options; } /** * Check result for errors * * @param DOMDocument $dom * @throws Zend_Service_Exception * @return void */ protected static function _checkErrors(DOMDocument $dom) { $xpath = new DOMXPath($dom); $xpath->registerNamespace('az', 'http://webservices.amazon.com/AWSECommerceService/2005-10-05'); if ($xpath->query('//az:Error')->length >= 1) { $code = $xpath->query('//az:Error/az:Code/text()')->item(0)->data; $message = $xpath->query('//az:Error/az:Message/text()')->item(0)->data; switch($code) { case 'AWS.ECommerceService.NoExactMatches': break; default: /** * @see Zend_Service_Exception */ require_once 'Zend/Service/Exception.php'; throw new Zend_Service_Exception("$message ($code)"); } } } }