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

[iPhone UI本] Tapworthy (原書) iPhoneアプリ設計の極意 (翻訳)

O'Reilly から本を紹介するメールが来て、その中で目がとまって結局iPhoneアプリとして購入

記事を読む

TestFlight を使ったベータテストについて

アプリのベータテストにご協力いただきありがとうございます。ベータテストには、AppleのTestFl

記事を読む

no image

Apple、iPhoneアプリは今後3.0互換でなければ受付けないと通告

Apple、iPhoneアプリは今後3.0互換でなければ受付けないと通告 うちにはこのメールは届いて

記事を読む

no image

iPad2 を iOS5 にアップデート

iOS5 はまだ不安定な印象があったので、iPod touch 4th に入れただけで様子を見ていた

記事を読む

no image

薄い iPad2用ケース eggshell for iPad2 TUN-PD-000079 購入 2011/06/27

不具合報告があったので、当初予定がなかったiPad2を購入。 それはまた別に書くとして、まずは一緒に

記事を読む

no image

iPhone SDKプログラミング大全

大全というのは大げさで入門という感じの本だけれども一通りどんなことができるのかを知るという点では使え

記事を読む

no image

[iOS SDK] iPhone/iPad はサイレントモードにしても音が鳴る

この前、iOS5 を入れた iPad2 で おんぷちゃん for iPad から音が鳴らない、ほかの

記事を読む

no image

SANWA SUPPLY MR-IPADST1 iPadスタンド

以前から欲しかったのと手頃な値段だったのでAmazonで注文してみた。 人気があるのか、1-3週間待

記事を読む

no image

EverLearn 1.3.0 をリリースしました

EverLearn 1.3.0 をリリースしました。(2013/10/25 公開) これまでの成績

記事を読む

no image

iPhoneアプリの無料版と有料版を同じソースから作りたい

こども向けに作った自作アプリおんぷちゃんは、習作でもあったのでiPhone無料版、iPhone有料版

記事を読む

Message

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

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

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年に受給していない人には手紙が届くらしい。 電子申請も

Vision Proアプリ開発本 8/24、8/26に発売

Vision Proアプリ開発入門 P400が 8/24 に発売、V

Developer Strap が日本でも購入可能に

USアカウントでしか購入できなかった Vision Pro 用 De

→もっと見る

PAGE TOP ↑