Amazon Web ServicesあらためAmazon Product Advertising APIのObjective-Cでの利用

公開日: : 最終更新日:2011/10/30 iPad, iPhone, , ,

去年はC#でAmazon Web Serviceを使ったデモアプリを作成していたのだが、今年はiPhoneで作ってみようと思い、記憶をたどってRESTを発行してみたところエラーになる。
これはなぜか? と調べていたところ、何と2009/8/15からAmazon Web Serviceが名前も変わって複雑な手順で呼び出さないと使えない仕様になっていた。
これはWeb開発者からするとおまえいまさら何をいってんだよという話題なんだろうけど、その手順の面倒さに結構驚いた。
とりあえずObjective-Cで作るとしたら、Representationsのページか、Switch!のページが良さそうだ。
あとは、認証対応するステップに関してはAjaxtowerさんAmazon本家のページか。

実際のProduct Advertising APIへ渡す検索文字列に関してはAmazonのProduct Advertising APIページか。
Signed Requests Helperという、Signed になっていない従来のURLをSignedの文字列にするページも公開されていた。実際にここでSignedなURLを作成してみると、どんなステップでどんな文字列が生成されるのか分かって理解しやすい。
渡すREST文字列の構成方法はここに書かれていた。一番使いそうなItemSearchは、API Reference → Operations → ItemSearch にある。
Java、C#、Perl、PHPのサンプルコードも公開されていた。
さすがにObjective-Cのコードはなかったが。

試しにiPhone用にObjective-Cで作ってみる

Representationsのページを参照させてもらい、iPhoneでAmazon Product Advertising APIを使うコードを書いてみる。
流れとしては、下記の通り。

  1. リクエストを生成する
  2. Timestampを付加する
  3. Query Parameterをアルファベットでソートする
  4. カンマやコロンなどをEscapeする
  5. 先頭にGET ecs.amazonaws.jp /onca/xml の文字列追加する(実際にはリージョンにより変える、そして改行が入る)
  6. SHA256のHMACを使って書名を作成する

引っかかったところ

ステップ2

iPhoneではNSCalendarDateは使えないらしい。

仕方ないので、NSDateFormatterのsetDateFormatにフォーマット文字列を渡して、さらにsetTimeZoneでタイムゾーンを設定してstringFromDate で規定のフォーマットのタイムスタンプを取得する。

 NSDateFormatter *form = [[NSDateFormatter alloc]init];
[form setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
[form setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSString *tstamp = [form stringFromDate:[NSDate date]]; 

ステップ4

ステップ4.の文字列のEscapeでも、”(ダブルクオート)がエスケープできなくてしばしはまる。¥ではなく\でエスケープしないといけないらしい。
表示だけの問題で、¥記号はちゃんとバックスラッシュになっていると思ったのだが、ちがうらしい。

ステップ6

Representationsのページではpublic domain code を使っているが、付属のCCHmacで問題ないと思ったため Switch!のページを参考にして、CCHmacを使う。
stringEncodedWithBase64 に関してはネットを検索して出てきたものを参考にさせてもらった。

これで一応完成のはず。

2010/11/02 追記
かなり久しぶりにAmazon Product Advertising API を使ったアプリを改造していたところ、AmazonからSignatureDoesNotMatchが返ってくる。
眠かったのもあって数時間はまっていたのだが、結局上記の Signed Requests Helper を使ってようやく原因が分かった。
Query Parameter をアルファベット順でソートしていなかったためだった。
このブログを書いているときは意識していたのだが、コード片をコピペして改造していたらそのことはすっかり忘れていた。
ということでこのエラーが出たらそういう可能性も疑ってみてくだされ。
BrowseNode 自体は、Amazon.co.jp はこちらで、Amazon.com ならこちらを参照した。

追記 2011/10/30

デジモノに埋もれる日々: Product Advertising API の仕様変更アナウンス – ItemSearchで10ページ制限?!など
さっぱりフォローしていなかったが仕様変更が行われていた。
AssociateID が必須になったということで試してみたがさっぱり動かないので調べていたところ下記を発見。
Amazon Product Advertising APIの仕様変更について – SirMilesの独り言
AWSAccessKeyId はパラメータ群の最初に持ってこないといけないとのこと。
確かにそのようにしたところ動作した。

関連記事

no image

iPad のマルチタッチジェスチャーによるバグ

iPad/iPad2 はXcodeを利用することでマルチタッチジェスチャーが利用可能になっていました

記事を読む

iPhone 6 Plus iSight カメラ交換プログラムに行ってきた

iPhone 6 Plus iSight カメラ交換プログラム - Apple サポート の発表があ

記事を読む

no image

iPhone SDK勉強会

iPhone 開発の勉強会をしよう、ということになったので、それ向けにメモを書いてみる。相手はいろい

記事を読む

Apple Event 2016秋 See you on the 7th

2016秋のApple Eventは 2016/09/07(日本時間 9/8 2:00)に行われた。

記事を読む

QUICCO Sound mi.1rev.3

Bluetooth でMIDI信号を飛ばせる QUICCO sound mi.1 について。以前 K

記事を読む

App Annie App Store 連携失敗

App Annie の App Store 連携機能を使って、日々のストアの売り上げをメールで受け

記事を読む

no image

iPhoneゲーム開発本 iPhone Games Projects

iPhone Games Projects、ようやくざっと読んだので内容をまとめてみる。 出版元のA

記事を読む

no image

[iPhone開発のネタ帳] loadView, viewDidLoad と viewDidUnload 2011/08/12

拙作のiPadアプリ タッチ!にほんちず や タッチ!ヨーロッパ地図でUIWebViewContro

記事を読む

no image

目からウロコが落ちる英文法書 「ハートで感じる英文法」

ここ数年英語が伸び悩んでいて、一時期は英文法にすがってみようとして3冊ほど英文法書にトライしてみたの

記事を読む

no image

OMNI OUTLINER and GRAFFLE活用ガイド 折中良樹

Macで図を描きたくてドロー系ソフトを探し、OmniGraffle体験版を使い、図を描いたら期限が切

記事を読む

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.

TORRAS iPhone 16 Pro Max用ケース

自分はiPhoneはケースを付けない派で、iPhone 12

iPhone 16 Pro Max 購入

iPhone 16 Pro Max 256GB 189000

Ember Mug 2のACアダプタをUSB Type-Cに変えてみた

冬になると活躍する Ember Mug 2 の充電器は付属のACアダ

Wi-Fi6Eルータ TP-Link AXE5400購入

Wi-Fi6E を試してみたくなり、TP-Link AXE5

児童手当 認定請求書申請 2024 「請求者が養育をする18歳に達する日以降の最初の3月31日までの子の数」とは?

2024年に受給していない人には手紙が届くらしい。 電子申請も

→もっと見る

PAGE TOP ↑