Objective-Cを使ったAmazon Web ServiceのリクエストURL作成
PHPやJavaScriptでのやり方を紹介しているところはたくさんあったので、Objective-Cで記述してみました。
とりあえず情報を取得できれば良いと思ったので、コードは汚いです。ww
Mac、iPhoneアプリでAmazonの商品検索など行ってみたい人は試してみてはいかがでしょう?
さて、AWSからの商品情報取得方法がややこしいと前述しましたが、AWSはリクエストのURLにタイムスタンプや署名情報を付加して送信しなければならない為、その他のAPIに比べて扱いが難しいと感じました。
AWSリクエストURL 例
http://ecs.amazonaws.jp/onca/xml?
AWSAccessKeyId=1SM7CKHWKSJKJFPKBA02
&Operation=ItemSearch
&ResponseGroup=Request%2CImages
&Service=AWSECommerceService
&Timestamp=2009-07-22T13%3A41%3A39Z
&Version=2009-07-01
&Nace%2BU3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg%3D
AjaxTowerより引用
上記のようなリクエストURLを作成しなければなりません。
エンコードもそれぞれ行わなければなりません。
やること
0 AWSのアカウントを取得
1 タイムスタンプの作成・追加
2 リクエストのパラメーターを値をURLエンコード
3 署名対象のリクエスト文字列の作成
4 HMAC - SHA256ハッシュアルゴリズムを使って署名を作成
5 署名をリクエストに追加
6 リクエスト!
0 AWSのアカウントを取得
これをやらないと何も始まりませんね。
http://aws.amazon.com/jp/
↑こちらからアカウントを新規作成して、AccesskeyIDとSecretKeyIDを控えます。
登録に関してはこちらを見ながらやれば出来ると思います!
1 タイムスタンプの作成・追加
//タイムスタンプ
NSDateFormatter *formatter = [[[NSDateFormatter alloc]init]autorelease];
[formatter setLocale:[[[NSLocale alloc]initWithLocaleIdentifier:@"JP"]autorelease]];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
NSString *time = [formatter stringFromDate:[NSDate date]];
AWSではタイムスタンプの記述方式を「2009-01-01T12:00:00Z」の様な形を指定してくるので、NSDateFormatterを使用して指定に合わせます。
2 リクエストのパラメーターを値をURLエンコード
次にリクエストに使うパラメーターをエンコードします。
ここでエンコードにNSUTF8StringEncodingを使うと=などを上手くエンコードしてくれないので、都合の良いようにエンコードしてくれるメソッドを追加します。
こちら[URL Encoding with Objective-C and Cocoa]のページを参考に、というか引用させていだたきました。
特定の文字列を置き換えるメソッドです。
-(NSString *) urlencode: (NSString *) url
{
NSArray *escapeChars = [NSArray arrayWithObjects:@";" , @"/" , @"?" , @":" ,
@"@" , @"&" , @"=" , @"+" ,
@"$" , @"," , @"[" , @"]",
@"#", @"!", @"'", @"(",
@")", @"*", nil];
NSArray *replaceChars = [NSArray arrayWithObjects:@"%3B" , @"%2F" , @"%3F" ,
@"%3A" , @"%40" , @"%26" ,
@"%3D" , @"%2B" , @"%24" ,
@"%2C" , @"%5B" , @"%5D",
@"%23", @"%21", @"%27",
@"%28", @"%29", @"%2A", nil];
int len = [escapeChars count];
NSMutableString *temp = [url mutableCopy];
int i;
for(i = 0; i < len; i++)
{
[temp replaceOccurrencesOfString: [escapeChars objectAtIndex:i]
withString:[replaceChars objectAtIndex:i]
options:NSLiteralSearch
range:NSMakeRange(0, [temp length])];
}
NSString *out = [NSString stringWithString: temp];
return out;
}
これをつかってパラメーターをエンコードしていきます
//タイムスタンプ
NSDateFormatter *formatter = [[[NSDateFormatter alloc]init]autorelease];
[formatter setLocale:[[[NSLocale alloc]initWithLocaleIdentifier:@"JP"]autorelease]];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
NSString *time = [self urlencode:[formatter stringFromDate:[NSDate date]]];
NSString *timeStamp = [NSString stringWithFormat:@"Timestamp=%@",time];
//サービス
NSString *awsECommerceService = @"Service=AWSECommerceService";
//アクセスキー
//ACCESSKEYは0で取得したAccessKeyID
NSString *accessKeyId = [NSString stringWithFormat:@"AWSAccessKeyId=%@",ACCESSKEY];
//キーワード
NSString *key = [@"ハリーポッター" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *keyWords = [NSString stringWithFormat:@"Keywords=%@",key];
//オペレーション
NSString *ope = @"ItemSearch";
NSString *operation = [NSString stringWithFormat:@"Operation=%@",ope];
//レスポンスグループ
NSString *res = [self urlencode:@"Medium,ItemAttributes,Images"];
NSString *responseGroup = [NSString stringWithFormat:@"ResponseGroup=%@",res];
//サーチインデックス
NSString *search = @"DVD";
NSString *searchIndex = [NSString stringWithFormat:@"SearchIndex=%@",search];
//バージョン
NSString *ver = [self urlencode:@"2009-07-01"];
NSString *version = [NSString stringWithFormat:@"Version=%@",ver];
キーワードやオペレーション、レスポンスグループ、サーチインデックスは自分の必要な物を選びましょう!
・オペレーション、レスポンスグループ一覧[ええもん屋 ラボ]
・サーチインデックス一覧[AjaxTower]
3 署名対象のリクエスト文字列の作成
署名作成の準備として、2で作成したパラメーターを全てくっつけます!
野蛮な方法ですが・・・
//署名文字列
NSString *urlString = [NSString stringWithFormat:@"%@&%@&%@&%@&%@&%@&%@&%@",accessKeyId,keyWords,operation,responseGroup,searchIndex,awsECommerceService,timeStamp,version];
NSString *signHead = [[NSString alloc]initWithString:@"GET\necs.amazonaws.jp\n/onca/xml\n"];
NSString *forSignString = [NSString stringWithFormat:@"%@%@",signHead,urlString];
4 HMAC - SHA256ハッシュアルゴリズムを使って署名を作成
3で作成した文字列と0で取得したSecretKeyIDをつかってHMAC-SHA256形式の署名を作成します。
ヘッダーをインポート
#import <CommonCrypto/CommonHMAC.h>
署名を作成
//署名作成
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
const char *cKey = [SECRETKEY cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [forSignString cStringUsingEncoding:NSASCIIStringEncoding];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
//署名を付加したRESTリクエスト作成
NSData *HMAC = [[NSData alloc]initWithBytes:cHMAC length:sizeof(cHMAC)];
NSString *hash = [self urlencode:[HMAC stringEncodedWithBase64]];
- (NSString *)stringEncodedWithBase64;
↑NSDataからBase64にエンコードするためにこちら[SOURCEFORGE.JP]のコードを参考にしました。
5 署名をリクエストに追加
さて、これで必要なものは全てそろったので、また全部くっつけてリクエストURLを作成します。
3で作った文字列はそのまま流用できるので使っちゃいます!
//リクエストURL
NSString *url = [NSString stringWithFormat:@"http://ecs.amazonaws.jp/onca/xml?%@&Signature=%@",urlString,hash];
6 リクエスト!
さてさて、リクエストURLが完成したのでさっそく試してみましょう!
自分は、webViewをつかってiPhoneシミュレーターで表示してみました!
当然PCなどのブラウザでも確認できます!

こんな感じでXMLが表示されてると思います!
その他参考資料
サンプルリクエストに署名を行うためのステップ[Amazonアソシエイト]
げむめも -Game Memo- リリース!!
5/16 iPhoneアプリ げむめも -Game Memo- をリリースしました!
げむめも -Game Memo- (以下げむめも) はあなたがプレイしたゲームや購入を検討しているゲームなどの情報を保存し、管理するアプリケーションです。
【主な機能】
1.ゲームのタイトル、カテゴリ、メーカー、ハード、日付、評価、状態、コメントを保存・管理
2.ゲームの各情報ごとに並び替え、分析が可能
3.楽天ブックスGAMEより簡単にゲーム情報が取得可能
4.ゲームタイトルによるインターネット検索(Google,Youtube,Wikipedia)
5.Twitter投稿・タイムライン閲覧機能
6.様々な画面モード(詳細・シンプル・カバーフロー)

↑ダウンロードはこちらから!
1.ゲームのタイトル、カテゴリ、メーカー、ハード、日付、評価、状態、コメントを保存・管理
以下のようにゲーム情報の入力・編集ができます!
![]() | ![]() |
2.ゲームの各情報ごとに並び替え、分析が可能
下の左の画像がトップ画面です。
画面下部にあるバーからゲームの各情報別に並び替えすることができます。
バー右側の▲ボタンを押す事によってバーを隠したり、出したりすることができます!
右の画像は分析画面です。
登録されているゲーム情報を状態・メーカー・ハード・カテゴリ・評価から数値を分析します。
![]() | ![]() |
3.楽天ブックスGAMEより簡単にゲーム情報が取得可能
げむめもは楽天ブックスGAMEより簡単にゲーム情報を取得することができます。
やり方は簡単で、新規作成画面にゲームのタイトルを入力し"楽天で検索"ボタンをタップ!
出てきた結果から保存したいゲームを選んでタップするだけで保存できます!
![]() | ![]() |
4.ゲームタイトルによるインターネット検索(Google,Youtube,Wikipedia)
げむめもは登録しているゲームのタイトルから簡単にインターネットで検索することができます!
気になっているゲームやお気に入りのゲームを登録してYouTubeでプロモーションビデオを観たり、攻略サイトを検索しましょう!
![]() | ![]() |
5.Twitter投稿・タイムライン閲覧機能
げむめもにはTwitter投稿機能が搭載されています。
投稿するのは簡単です。げむめもが自動でツイートを作成してくれるので、入力しなくてもボタン1つ押すだけでツイートすることができます!
また、テンプレートをいくつか用意しているので、気分に合わせてツイートすることができます。
また、このアプリケーションのハッシュタグ#gamememoを利用し、アプリケーションの利用者同士でコミュニケーションを取ることも可能です!
![]() | ![]() |
6.様々な画面モード(詳細・シンプル・カバーフロー)
げむめもには3種類の画面表示モードがあります。
ゲームの情報をまとめて表示する詳細モード、タイトルのみ表示して見つけ易くするシンプルモード、ゲームの情報をよりグラフィカルに表示するカバーフローモード
用途や気分に合わせて表示を切り替えることができます!
![]() | ![]() |
以上がげむめもの主な機能になります。
ゲーム情報をメモすることによって自分の好きなゲームの傾向がわかったり、友人などにおすすめするときに役に立つと思います!
興味のある方は是非ダウンロードしてみてください!
また、希望や要望などがあればどんどん言ってください!可能な限り対応します!
それでは、げむめもを末永くよろしくお願いいたします!

↑げむめも-Game Memo- Ver1.0.0 ダウンロードはこちらから!
むびめも-Movie Memo- Ver.3.0.1 アップデート申請中
本日、むびめも-Movie Memo- Ver.3.0.1 のアップデートを申請しました。
アップデート内容は以下の通りです。
-カバーフローのレスポンスの改善
-映画タイトル検索にTwitter検索を追加
![]() | ![]() |
アップデート完了までしばらくお待ちください。
Ver.3.0.0は現在ダウンロードできます!無料です!
↓こちらからどうぞ
むびめも -Movie Memo-(Ver.3.0.0)
むびめも-Movie Memo- Ver.3.0.0 公開中!
むびめも-Movie Memo- Ver.3.0.0 アップデート申請中
本日 むびめも-Movie Memo- Ver.3.0.0 のアップデート申請を行いました。
アップデート内容は以下の通りです。
・UIの大幅変更
-全ての画面を1つの画面にまとめました(All,Cover,Category,Actor)
・映画情報の自動取得機能を搭載しました
・コード量を削減し、動作が軽快になりました(当社比)
・UIの大幅変更
![]() |
TOP画面です。元々下にあったボタン類や、ソートバーが無くなり、非常にスッキリとした画面になりました。
![]() |
操作を行うには、右上のボタンを押します。
・映画情報の自動取得機能
"新規作成"を押すと下の左の画面が出ます。
タイトルを入力し、"楽天で検索"を押すと検索結果から保存したい映画情報を選択することができます。
![]() | ![]() |
![]() | ![]() |
検索結果から、タイトル、日付(発売日)、監督名、俳優名、画像を取得することが出来ます。
現在のところ、楽天ブックス(DVD&Blu-rayジャンル)での検索結果のみ対応しています。
・ソート(並び替え)機能の変更
"並び替え"を押すと画面下にバーが出現し、それで並び替えを行う事ができます。
バーを隠したい場合、"×"ボタンを押せば隠す事が出来ます。

・CoverFlow
好評だったCoverFlow画面は健在で、TOP画面左上のボタンを押すと切り替えることができます。
前回のは画像を拡大して、一部分のみ表示させていたのですが、今回は画像全体が表示されるようにしました。

目立った機能は以上です。
他には入力画面の統一やデータベース周りの処理の変更などいろいろやってます。
機能追加以上に内部的な変更がメインになってます!
でも、映画情報を自動で入力できるようになったので、是非使っていただければと思います。
前回アップデートからだいぶ時間が開きましたが、納得出来るものが完成しました!
これからもむびめも-Movie Memo-を末永くよろしくおねがいいたします!
それでは、アップデート完了までしばらくお待ちください。
Ver.2.0.0は現在ダウンロードできます!無料です!
↓こちらからどうぞ
むびめも~Movie Memo~(Ver.2.0.0)























