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

[iPhone5] ステータスバーの謎の○(丸)表示

iPhone5使い始めて2日目、自宅でもLTE表示が出ていたのになぜかある時から○表示になってしまっ

記事を読む

no image

いろいろ考えさせられた 「ウェブ×ソーシャル×アメリカ」池田 純一著

TwitterのTLで誰かがつぶやいていて、Amazonを見たらレビューで激賞されていたので買ってみ

記事を読む

no image

[iOS SDK] NSUserDefaults boolForKey でNOが返ってくるとNOが格納されていたのか値が存在しなかったのかが不明

NSUserDefaults Class Reference にあるとおり、NSUserDefau

記事を読む

iOS14からおんぷ先生と接続できない

下記の問い合わせがあり、調べたところ、iOS14からおんぷちゃんとおんぷ先生がBluetoothで

記事を読む

iOS9からGKSession over Bluetoothが無効に

ユーザの方からおんぷ先生アプリが接続できないという報告があり調べていたところ、iOS9からGameK

記事を読む

no image

マジック・ツリーハウス 作品名一覧

かいけつゾロリを卒業したうちの小学2年生の娘が今はまっているのがマジック・ツリーハウス。 周りで流

記事を読む

no image

iPhoneアプリケーションプログラミング 新居雅行 購入

今年6月末にでたときには、「またiPhoneプログラミング本が出たんだなー」「表紙が地味だなー」「特

記事を読む

[WatchKit] Apple WatchアプリをRejectされた話

Apple Watch はいつの間にか電池がかなり減っていることが多く、いつどのように減っているか知

記事を読む

no image

[iOS開発本] 15歳からはじめる iPhone わくわくゲームプログラミング教室

CALayerの使い方が書かれている本を持っていない気がしたので参考になりそうだったのと、高速バスで

記事を読む

no image

最近読んだ本: これでiPhoneアプリが1000万本売れた 南雲 玲生著

周りでおもしろいと言っている人がいたので買ってみた。2011/05/21発売。 株式会社ユードーの南

記事を読む

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 ↑