何度やっても同じ

ただの日記

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();  // これを追加!

てかなんでサンプルそのまま動かんの(・_・、)