スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Objective-Cを使ったAmazon Web ServiceのリクエストURL作成

Amazon Web Service (以下 AWS) の AWSECommerceService を使って商品情報の取得がしたかったのですが、情報の取得方法がややこしかったのでまとめてみます。



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/


↑こちらからアカウントを新規作成して、AccesskeyIDSecretKeyIDを控えます。
登録に関してはこちらを見ながらやれば出来ると思います!



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などのブラウザでも確認できます!


スクリーンショット(2011-06-04 23.20.21)


こんな感じでXMLが表示されてると思います!



その他参考資料
サンプルリクエストに署名を行うためのステップ[Amazonアソシエイト]


スポンサーサイト

コメントの投稿

非公開コメント

承認待ちコメント

このコメントは管理者の承認待ちです

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

承認待ちコメント

このコメントは管理者の承認待ちです

承認待ちコメント

このコメントは管理者の承認待ちです

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

承認待ちコメント

このコメントは管理者の承認待ちです
Counter
Apps
icon512_flat.pngWord Memo

クイズ作成機能付き多機能単語帳
無料

icon512_flat.pngぶくめも
-Book Memo-


書籍情報の保存・管理ツール
無料

icon512_flat.pngむびめも
-Movie Memo-


映画情報の保存・管理ツール
無料

icon512_flat.pngげむめも
-Game Memo-


ゲーム情報の保存・管理ツール
¥85

icon512_flat.pngげむめも
-Book Memo- Lite


ゲーム情報の保存・管理ツール
無料

Profile

peromasamune

Author:peromasamune
ペロ政宗ぶろぐへようこそ!
Apple・iPhone・プログラミングなどの情報を扱ってまいります。

「むびめも-Movie Memo-」という映画管理アプリの開発者です!お手柔らかにおねがいします!

2011/12/15 新アプリ「Word Memo」リリースしました!

facebookページ
イイネ!お願いします!

Twitter
Latest Article
Latest TrackBacks
Monthly Archives
Category
RSS
Search Form
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。