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 はパラメータ群の最初に持ってこないといけないとのこと。
確かにそのようにしたところ動作した。
関連記事
-
スルーされない技術 石田章洋
スルーされない技術石田 章洋 かんき出版 2014-07-09売り上げランキング : 14971A
-
iOS15にアップデート
2021/09/21にiOS15が公開され、そろそろ初期不具合もわかってきた頃だと思いアッ
-
iPhone SDK 3.1.2 のお知らせ
Appleより、iPhone SDK 3.1.2 のお知らせが来た。 3.1.2 はバグフィックスリ
-
[iPhone SDK] アプリケーションのローカライズ
iPhoneアプリを作っていて、一通り作り終わったら最後にやる作業の一つとして、ローカライズがある。
-
iPad 第7世代がほしい
自分は iPad mini 4 を使っているが、これだと画面が小さくて、リフロー版でないK
-
[iOS SDK] iPhone 6 Plus を Xcode に追加する
なぜか毎回新規デバイス追加に少し手間取ってしまう。 今回は先日購入した iPhone 6 Plus
-
Guideline 2.5.10 – Performance – Software Requirements で Reject
2019年3月27日以降、iPhone Xs Maxの画面サイズ6.5インチのスクリーンショットが
-
ドラム譜学習アプリ「ドラムちゃん」を紹介いただきました
Echodelic さん、Appliv さん、キッズアプリCOMさんで ドラム譜学習アプリ ドラムち
-
iTunes Connect でアプリページを表示できない
いつからかわからないけれども、iTunes Connect で自分のアプリを表示できなくなってしまい
-
[iPhone開発関連本] iPhoneアプリ成功の法則
和田純平 JYProduct 深津貴之 fladdict @iphone_dev_jp, 海外プレス