blog@RevivalGate / プログラミング

夢がいっぱいフリルいっぱいなマイクロブログ。ほぼ中の人専用備忘録。

Content

発生問題

ZendFramework 1.11.11 の Zend_Service_Amazon を使用して Amazon API からデータ取得を行うアプリケーションを作成していたところ、先週(10/23)までは動いていた Zend_Service_Amazon_Query->search() 部分で急に Exception を発生させるようになった。Exception の message はリクエストには、必要なパラメータが含まれていません。必要なパラメータには、AssociateTagなどがあります。 (AWS.MissingParameters)で、 Zend_Service_Amazon の itemLookup() や itemSearch() で発生している。

原因

2011-10-26 に AmazonAPI で行われた仕様変更が原因。

Associate Tag パラメータ:
全てのAPIへのリクエストにおいて、有効なAssociate Tagを含めていただくことが必要となります。有効なAssociate Tagを含まない全てのリクエストはエラーとなり、エラーメッセージが表示されます。Associate Tagパラメータの詳細については、開発者ガイド をご参照ください。

お客様のアプリケーションへの影響
(中略)お客様のアプリケーションが、現在有効なAssociate Tagを含めずにAPIにアクセスされている場合、リクエストは処理されなくなります。アプリケーションに必要な変更を加え、全てのリクエストにAssociate Tagを含めるようにしてください。

開発ガイドでは AssociateTag の必須欄は「いいえ」なのにな…。通信監視したらたしかに送っていない。しゃーないので Zend_Service_Amazon が AmazonAPI に送っている Query を見直す。

対応

要は Zend_Service_Amazon::_prepareOptions() で AssociateTag が送られないのが問題なので、以下のいずれかでいける。(AssociateTagは自分のものに直す)

  • Zend_Service_Amazon_Query を使って Amazon 検索をオーバーロードで実行している($query->Category('DVD')->Keywords('はがない'); のようなケース)の場合、$query->AssociateTag('revivalgate-22'); のように自分の使用している associate tag を付与する。
  • Zend_Service_Amazon ないしは Zend_Service_Amazon_Query を継承したラップクラスを使っている場合は、その継承先に以下のコードを仕込む。

    protected function _prepareOptions($query, array $options, array $defaultOptions) {
        $options['AssociateTag'] = 'revivalgate-22';
        return parent::_prepareOptions($query, $options, $defaultOptions);
    }
  • 面倒くさければ Zend_Service_Amazon::_prepareOptions の先頭行に $options['AssociateTag']   = 'revivalgate-22'; をぶち込む。

検索しても1件も出なかったが、同じ問題で引っかかった人がいるかも知れないので一応メモしておく。プログラム的にはクソみたいな修正のレベルなので事前に知ってさえいればすぐ対策できたけれど、こんな変更があったなんて注意深く見ないと気づかないわ…

Address/Information

Caren (Twitter) / blog@RevivalGate