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 はパラメータ群の最初に持ってこないといけないとのこと。
確かにそのようにしたところ動作した。

関連記事

EverLearn 1.9.0 に音声認識機能を追加しました

EverLearn 1.9.0 にて音声認識機能を追加しました。ホーム画面から、マイクボタンを押して

記事を読む

no image

[iPhone 開発本] iOS SDK Hacks の感想など。

iOS SDK Hacksは発売前から話題になっていて、発売日は10/23だが前日に新宿ジュンク堂に

記事を読む

リズムくんHD 1.2.1 で iOS11に対応しました

iPad用のリズムくんHD のiOS11対応が遅れてしまったため、2017年11月あたりからiOS1

記事を読む

no image

[感想] ルールを変える思考法 川上量生(著)

Kindle セールで安く売られていたのと、ゲーマー向けの話が多いということで買ってみた。 非ゲー

記事を読む

新アプリ「コードちゃん」を公開しました

速報:新 iPad 発表。Apple Pencil対応で3万7800円から - Engadget

記事を読む

no image

iPhone Core Audio プログラミング (Extended Audio File Services)

発売日からずっと気になる存在だったが、Audio Queue Services を使ったプログラムを

記事を読む

no image

タッチ! アメリカ地図 1.1 アップデート

タッチ! アメリカ地図のアップデート (バージョン 1.1) が今朝公開されました。 アメリカの州は

記事を読む

no image

[Kindle本] 英語にも王道はないその証明 山森宣人著 の感想

Kindle本311円。(2014/01/07) Kindle Store でたまたま発見して、気

記事を読む

no image

[iPhone5] 使用開始5日目の感想

au iPhone5を発売日翌日(9/22)に購入してから5日経ったので感想を書いてみる。 し

記事を読む

no image

iPhoneアプリにAboutBoxを実装

iPhoneアプリにAboutBoxを実装するためのメモ。 今回、自分のiPhoneアプリにAbou

記事を読む

Message

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

ポモドーロテクニック用物理タイマーならTime Timer

会社ではなかなか自由に時間を使えないが、家で読書や作業をする

DELL 32インチディスプレイ U3223QE 購入

Dell U3223QE は解像度 3840x216

WWDC 2023 Vision Pro発表

2023/6/5 (日本時間 2023/06/06 2AM)のWWD

M1 MacBook Air を Venturaにアップデートする

M1 MacBook Air を macOS Montere

iOS16でaurioTouch の inBufferFramesが1になる

https://developer.apple.com/librar

→もっと見る

PAGE TOP ↑