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 はパラメータ群の最初に持ってこないといけないとのこと。
確かにそのようにしたところ動作した。
関連記事
-
-
無料版アプリの効果について
最近いくつかiPhoneアプリの無料版の提供に関してのブログが上がって、考えさせられている。 fla
-
-
はじめてのiPhoneプログラミング 正誤表
発売されてからすぐ はじめてのiPhoneプログラミング を購入し、必要に応じて少しずつ読み進めてい
-
-
[iPhone SDK] アクションメソッドの種類
UIKitのコントローラは、3種類のメソッドで呼び出すことができる。 いつもこれを忘れてしまうので、
-
-
コードちゃん 1.2.1 をリリースしました
3年以上アップデートしていなかった、コードちゃん をアップデートしました。 Cmb5
-
-
Guideline 2.5.10 – Performance – Software Requirements で Reject
2019年3月27日以降、iPhone Xs Maxの画面サイズ6.5インチのスクリーンショットが
-
-
Parse から Heroku, AWSへの移行ガイド
2017年1月28日にParseのサービスが終了するという衝撃的なニュース(Moving On)
-
-
[iOS SDK] CGRect 関連の便利機能
CGRect を使っていていつも忘れて調べてしまうのでメモしてみる。 CGRect の変数を拡大・
-
-
英単語学習アプリ EverLearn 1.4.0 を公開しました
ようやく、iOS7 に対応した EverLearn 1.4.0 を公開しました。 i
-
-
おんぷちゃん for iPad 1.9.0が異常終了する
ユーザの方から下記の連絡がありました。 おんぷちゃんfor iPadを使用させて頂いておりま
-
-
[Kindle本] ソニー・エリクソン 〜グローバル携帯〜: かつて日本のケータイが全米でNo1になった
Amazonプライム会員なので、毎月プライム会員特典で読めるKindle本を探すのだが、2016年2