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 はパラメータ群の最初に持ってこないといけないとのこと。
確かにそのようにしたところ動作した。
関連記事
-
-
ツイッター 140文字が世界を変える コグレマサト+いしたにまさき
一度途中まで書いたのが手違いで消してしまった...のでもう一度。 一応Reviewplusさんからの
-
-
[iPhone SDK] ネットワーク接続の有無を確認する方法
iPhoneでネットワーク接続できないときには一応エラーダイアログを出す方がよいだろうと考えて方法を
-
-
おんぷちゃん for iPad リアル鍵盤で回答
おんぷちゃん for iPad は五線譜上に表示される音符をスクリーン上のキーボードや、USBやB
-
-
リズムくんHD 1.2.1 で iOS11に対応しました
iPad用のリズムくんHD のiOS11対応が遅れてしまったため、2017年11月あたりからiOS1
-
-
LogLocation 1.3.1 で和暦問題に対応しました
4年ぶりに位置情報ログ取りアプリ LogLocations をアップデートしたところ、レビューにて不
-
-
iPad スタンド SANWA SUPPLY MR-IPADST1 感想
以前書いた、iPad スタンド SANWA SUPPLY MR-IPADST1 が届いて、しばらく使
-
-
[iOS SDK] Miselu C.24 対応(Bluetooth MIDI対応)
自作アプリの Miselu C.24 対応(というかBluetooth MIDI対応)を行ったので、
-
-
iPhone 6 Plus iSight カメラ交換プログラムに行ってきた
iPhone 6 Plus iSight カメラ交換プログラム - Apple サポート の発表があ
-
-
App Bundle は公開後は追加・削除できない
App Storeには App Bundleという仕組みがあり、複数のアプリをまとめてお得な値段で
-
-
深見先生のICT Music Session vol.2に参加してきた
2016年1月24日(日)14:00 - 16:30に行われた ICT Music Session