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 で規定のフォーマットのタイムスタンプを取得する。

ステップ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 はパラメータ群の最初に持ってこないといけないとのこと。
確かにそのようにしたところ動作した。

関連記事

開発用iPad比較検討2016

手持ちのiPad2およびiPad mini 初代がiOS10のサポート対象から外れてしまったので、i

記事を読む

no image

[iPhone開発本] iPhoneではじめるOpenGL ESプログラミング

2010/07/13(火)発売。昨日書店で立ち読みしてみたら良さそうな本だった。 パンカクの本も良か

記事を読む

no image

iPad2 を iOS5 にアップデート

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

記事を読む

no image

[iPhone SDK] 自作iPhone アプリのアイコンをつや消しにする

iPhone のホーム画面に表示されるアプリアイコンは自動的に てかてか つやつや 効果を付与されて

記事を読む

no image

iPad スタンド SANWA SUPPLY MR-IPADST1 感想

以前書いた、iPad スタンド SANWA SUPPLY MR-IPADST1 が届いて、しばらく使

記事を読む

おんぷちゃん for iPad 大譜表モード+MIDI対応を追加しました

おんぷちゃん for iPad: ぽこ・あ・ぽこ の方がおんぷちゃん for iPad を紹介してく

記事を読む

no image

[iOS SDK] モーダル表示したViewController を取得する

UIViewControllerの presentViewController:animated:c

記事を読む

no image

iPhoneアプリビジネス本 The Business of iPhone App Development

iPhoneアプリを売るための情報が詰まった本。 ここまでやるか、というくらいの情報が詰まっている。

記事を読む

no image

Lexical or Preprocessor issue ‘xxx.h’ file not found

NSMutableArray に要素をランダムに並び替える機能を入れようと思い、 objective

記事を読む

no image

iPhoneアプリ おんぷちゃん開発日記 和音表示

自分の娘のために作った五線譜学習アプリ「おんぷちゃん」の開発を細々と続けている。 iPadのグランド

記事を読む

Message

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Rinker 導入でInternal Server Error発生

商品リンク管理プラグインRinker(リンカー)の公式サイト | お

新しいAirPodsを買ってみた

2019年3月20日に突如発表された、新しい AirPods を買っ

Apple Developer Program更新2019

今年も更新。税別 11800円だった。 2009年から

ボーカロイド技術論

よくこんなマニアックな本を出したものだし、よくここまで内情を書いたも

さくらVPSのPHPを5.3から7.2にアップデート

iPhoneから転送した写真をWordpressブログにアップロード

→もっと見る

PAGE TOP ↑