Amazon Web ServicesあらためAmazon Product Advertising APIのObjective-Cでの利用
去年は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を使うコードを書いてみる。
流れとしては、下記の通り。
- リクエストを生成する
- Timestampを付加する
- Query Parameterをアルファベットでソートする
- カンマやコロンなどをEscapeする
- 先頭にGET ecs.amazonaws.jp /onca/xml の文字列追加する(実際にはリージョンにより変える、そして改行が入る)
- 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 はパラメータ群の最初に持ってこないといけないとのこと。
確かにそのようにしたところ動作した。
関連記事
-
-
[iOS8] BlocksKit で不具合発生
iOS8 にアップデートしたところ、BlocksKit の UIAlertView と UI
-
-
iOS16でaurioTouch の inBufferFramesが1になる
https://developer.apple.com/library/archive/sampl
-
-
[iOS SDK] UIAlertView が消えた後にキーボードが表示される
昔書いたコードで、UIAlertView に setAlertViewStyle で UIAlert
-
-
ドラムアプリ「ドラムちゃん」用に電子ドラムiWordを買ってみた
自作ドラム学習アプリ「ドラムちゃん」には以前からMIDIドラムを接続することができたが、これまでな
-
-
[iOS] iPhone とつながるG-SHOCKの注意すべき仕様
CASIO 腕時計 G-SHOCK ジー・ショック Bluetooth Low Energy対応
-
-
iPhoneアプリケーションプログラミング-オンライン版
先日紹介した、新居雅行氏のiPhoneアプリケーションプログラミングだが、オンライン版が存在する。
-
-
いまさらながらXcode4導入 2011/06/29
Twitterを見ているといろいろ大変そうだったので敬遠していたXcode4だが、デバッグに便利そう
-
-
[iPhone開発本] iPad電子書籍アプリ開発ガイドブック
2010年8月23日発売らしい。3570円と高いけれども、内容は濃そうだ。 目次はImpress D
-
-
[iOS SDK] モーダル表示したViewController を取得する
UIViewControllerの presentViewController:animated:c
-
-
深見先生のICT Music Session vol.2に参加してきた
2016年1月24日(日)14:00 - 16:30に行われた ICT Music Session