引き続き、Google App Engineで色々遊んでいます。
折角なので、他のウェブサービスのAPIも利用してみようかな〜っと思いまして、
王様の一つである"Amazon Product Advertising API"をチャレンジしてみました。
Amazon側は、Google App Engine用のサンプルとかを置いていませんが、
Java開発者用向きのサンプルコードをリリースしています。
具体的に言うと、サンプルコードの「ItemLookupSample.java」と、
アマゾンへのリクエストを補助するための「SignedRequestsHelper.java」ですね。
ソースコードのファイルそのものは、下記のURLから取得出来ます。
Product Advertising API Signed Requests Sample Code – Java REST/QUERY
基本的に、「ItemLookupSample.java」はサンプルなので、
これをそのまま使う…ではなく、これを参考して、
「SignedRequestsHelper.java」を経由し、
自分でリクエストをAmazonに送信するコードを書く必要があります。
で、「SignedRequestsHelper.java」をそのまま
Google App Engineで使いところ…ですが、
ちょっとした修正を加える必要があります。
まず、このまま使おうとしたら、こんな感じのエラーが出ます。
「java.lang.ClassNotFoundException: org.apache.commons.codec.binary.Base64」
で、色々調べたら、この問題が起きるのは、
恐らくGWT(Google Web Toolkit)も使っていたので、
そこにうまくリフレクションが出きなかった…のような気がします。
ネットでいろいろ調べましたが、どうも今ひとつパッっとした解決策が見つからず。
で、自分でEclipseで色々試しましたら、
GAE/Jのパッケージの中に、専用のBase64クラスがある…っと気づきまして、
これを使ったら、問題はアッサリ解決出きました。
折角なので、解決法をメモを兼ねてここに書き残します。
本来の「SignedRequestsHelper.java」では、
「import org.apache.commons.codec.binary.Base64;」で、
apacheコモンズのcodecの中のBase64を使っていましたが、
これをGAE/Jのやつで置き換えます。
具体的に言うと、こんな感じです。
「import com.google.appengine.repackaged.com.google.common.util.Base64;」
で、このBase64クラスは本来のBase64クラスの使い方がちょっと違いますので、
private String hmac(String stringToSign)メソッド内の記述も変更します。
176行のこのメソッドのBase64の記述は元々こんな感じですが…
Base64 encoder = new Base64();
signature = new String(encoder.encode(rawHmac));
これをこんな感じで一行に書き換えます。
signature = new String(Base64.encode(rawHmac));
こんな感じで、少なくともぉぅぇぃは問題を解決し、
Google App Engine for JavaからAmazin APIへ問題なくリクエストを出すことが出きました。
コードをいじっていましたら、「SignedRequestsHelper.java」のほかにも、
いろいろ発見がありましたが、別の機会がありましたら、
またちょこっと話をしたいと思います。
それにしても、GAE/Jのチュートリアルとドキュメントは素晴らしいですね…。
テキストも参考書も要らずに、チュートリアルに沿ってやるだけで、
いろいろ理解してしまいます。
大半の問題は、ドキュメントやFAQで解決できてしまいます。
というか、本屋でGAE/Jの本も何冊立ち読みしてみましたが、
グーグルのドキュメントのほうがずっと良かったね。
こんなのウェブ上で公開していたら,そりゃ出版社はピンチになりますね。
しかし、パソコンでこういうドキュメントを読んでいると、
やっぱりちょっとつかれるな〜って感じになりますね。
目とか肩とか…ね。
iPlateに全く興味無かったが、こういうものを読むための、
何かしらのリーダーがあるといいかもしれません〜