Amazon Production Advertising APIとCocoa 第2回

2009年8月4日火曜日
さて、タイムスタンプまで作成が終わりました。

3.項目名と項目内容で対の配列を作り、かつ項目内容をURLエンコードする。

1.で作ったRESTの文字列のうち、?以下の内容を、項目名(例えばService)と項目内容(AWSECommerceService)を対にした配列にします。配列というか、Rubyでいうハッシュでしょうか。私はNSMutableDictionaryを使いました。
AWS_IDは、ヘッダファイルに

#define AWS_ID @"アクセスキー"

として定義しています。
同じく秘密キーも

#define S_ID @"秘密キー"

として定義しました。



NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setValue:@"AWSECommerceService" forKey:@"Service"];
[dict setValue:AWS_ID forKey:@"AWSAccessKeyId"];
[dict setValue:@"ItemLookup" forKey:@"Operation"];
[dict setValue:isbn forKey:@"ItemId"];
[dict setValue:@"ISBN" forKey:@"IdType"];
[dict setValue:@"Books" forKey:@"SearchIndex"];
[dict setValue:[self urlencode:@"Medium,Offers,Images"] forKey:@"ResponseGroup"];
[dict setValue:[self urlencode:@"2009-03-31"] forKey:@"Version"];
[dict setValue:[self urlencode:time] forKey:@"Timestamp"];



urlencodeというメソッドが出てきますが、これは例えば,(カンマ)を%2にするようなURLに含めない文字列を%付きの文字にするものだそうです。なんかそれらしきメソッドもあるらしいのですが、問題が起こるという話もあったので、こちらにあったものを流用させていただきました。



-(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;
}



NSStringクラスにメソッドを上書きしても良いのかも知れません。リンク先ではNSStringのクラスメソッドとして作成されていますが、どうもクラスメソッドとインスタンスメソッドの違いが分かっていない私は、同じところで使いたいので、インスタンスメソッドにしちゃいました。ただし、このエンコードはスペースをエスケープしてくれないみたいです。

4. 項目名のバイト順に並べ替え、署名を作るための文字列を作る

さて、dictを項目名順に並べ替え、それを配列にします。


NSArray *keyArr = [[dict allKeys]sortedArrayUsingSelector:@selector(compare:)];


さらに、項目名でdictから項目内容を取り出し、&で繋いで文字列にします。



NSMutableString *urlString = [[NSMutableString alloc]init];
NSEnumerator *enumerator = [keyArr objectEnumerator];

id key;

while (key = [enumerator nextObject]){

  if([keyArr indexOfObject:key] > 0){
   [urlString appendString:@"&"];
   }

  [urlString appendFormat:@"%@=%@", key, [dict valueForKey:key]];

}

NSString *signHead = [[NSString alloc] initWithString:@"GET\necs.amazonaws.jp\n/onca/xml\n"];
NSString *forSignString = [NSString stringWithFormat:@"%@%@", signHead, urlString];



最後に以下の文字列をくっつけています(改行要)。後の処理を考えると、urlStringとsingHeadは別々にしておいたほうがベターです。



GET
ecs.amazonaws.jp
/onca/xml



これで署名を取得するための文字列が完成です。

0 コメント:

コメントを投稿