Amazon の Product Advertising API Signed Requests Sample Code - Java REST/QUERY が動かない
ここ↓からダウンロードしたサンプルを、自分のIDとSECRET KEYに置き換えて動かしてみたわけですが。
http://aws.amazon.com/code/2478
こうなります。
Caused by: java.io.IOException: Server returned HTTP response code: 403 for URL: http://ecs.amazonaws.jp/onca/xml?AWSAccessKeyId=nya&ItemId=4774144681&Operation=ItemLookup&ResponseGroup=Small&Service=AWSECommerceService&Timestamp=2010-11-28T04%3A43%3A18Z&Version=2009-03-31&Signature=ZkKt5nNNoLUtQVLy93esy%2Broybfgqb1lVp7ZCZTA8yg%3D%0D%0A
ブラウザでこのURLにアクセスしてみると、エラーの詳細がわかります。署名が間違ってますと。
<?xml version="1.0"?> <ItemLookupErrorResponse xmlns="http://ecs.amazonaws.com/doc/2009-03-31/"> <Error> <Code>SignatureDoesNotMatch</Code> <Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.</Message> </Error> <RequestID>にゃー</RequestID> </ItemLookupErrorResponse>
ちょっと調べたところ、Signatureの末尾に "%0D%0A" というのがついてますが、これ、改行コードをURLエンコードした値で、これが余計。どうも、HMACをBase64エンコードしたときに、HMACの末尾に改行が付加されてしまっているのがまずいようです。なので、SignedRequestsHelper#hmac メソッドに、こう、下記の一行を追加してあげればうまくいきます。
Base64 encoder = new Base64(); signature = new String(encoder.encode(rawHmac)); signature = signature.trim(); // これを追加!
てかなんでサンプルそのまま動かんの(・_・、)