先週【重要・あと30日です】メールなんてことで、Amazon アソシエイト Web サービスが 8月15日以降使えないそうなので、先日の[gTunes] も amazon-a2s-2007-10-29-java-library を使っている関係上、署名認証の機能を含めないと動かなくなりますね。動かないと面白くないので、少し連休中に勉強しました。
ここ から Amazon の Java Sample をダウンロードしました。詳細な使い方は、付属の README に書かれていますが、コマンド・プロンプトから ant run で 署名認証して、決め打ちの ITEM_ID(ASIN) の ItemLookup から Title が表示されます。早速 NetBeans 6.7、Grails 1.1.1 でプロジェクト名:AmazonBook を作って、Grails 上でも使えるようにしてみました。( ITEM_ID は本以外にも全ての商品が対象のようだから Book でなくてもいいんだけど)
サンプルには、ソースとして SignedRequestsHelper.java と ItemLookupSample.java が提供されているので、SignedRequestsHelper はそのまま、Javaソースパッケージフォルダーにコピー。ItemLookupSample を AmazonItemLookupService.groovy としてサービスフォルダーに作成。
コードは、下記のような感じ。
/**
* Amazon Product Advertising API を使ったサンプル
* API Version: 2009-03-31
* ASIN で Book名を入手 とりあえず。
*
*/
package com.yuruyakana
import com.amazon.advertising.api.sample.SignedRequestsHelper
import org.codehaus.groovy.grails.commons.*
import net.sf.ehcache.Element
class AmazonItemLookupService {
boolean transactional = false
String AWS_ACCESS_KEY_ID
String AWS_SECRET_KEY
String ENDPOINT
//def titleAuthCache
def getItemLook(ITEM_ID) {
/* Set up the signed requests helper */
SignedRequestsHelper helper
try {
helper = SignedRequestsHelper.getInstance(ENDPOINT, AWS_ACCESS_KEY_ID, AWS_SECRET_KEY)
} catch(Exception e) {
log.error "Problem communicating with SignedRequestsHelper: ${e.message}", e
//e.printStackTrace();
return;
}
String requestUrl = null
String title = null
// map形式
println "Map form example:"
Map params = new HashMap()
params.put("Service", "AWSECommerceService")
params.put("Version", "2009-03-31")
params.put("Operation", "ItemLookup")
params.put("ItemId", ITEM_ID)
params.put("ResponseGroup", "Small")
requestUrl = helper.sign(params)
println "Signed Request is " + requestUrl
// XML構文解析
def uri = requestUrl.toURI().toString()
//def xml = requestUrl.toURL().text
println "Response URI: " + uri
//println "Response XML: " + xml
// URLだと日本語でEND-Tagで文字化けしてエラーになるので、URIを取得してParseすることでOK。
def ItemLookupResponse = new XmlSlurper().parse(uri)
//def ItemLookupResponse = new XmlSlurper().parseText(xml)
println "ITEM Title: " + ItemLookupResponse.Items.Item.ItemAttributes.Title
println "ITEM Author: " + ItemLookupResponse.Items.Item.ItemAttributes.Author
}
}
変更したところは、概ね以下の3点:
- AWS_ACCESS_KEY_ID、AWS_SECRET_KEY、ENDPOINT を Config.groovy にbeans として
移行。ENDPOINT は別に移動しなくても6か所ほど選択できるようなので、DOMAINで選択できるよう
にしておいても良いですね。
- Controller 側で上記 Service のgetItemLook(ITEM_ID) を呼び出したこと。
- XML 構文解析を Java の DocumentBuilder から Groovy の XmlSlurper にしたこと。
- toURL() メソッドは、URL 内で使用できないエスケープ文字は自動的に変換できないので
非推奨になっています。
今回は、XMLの階層全て書いてタイトル表示しているので、スマートじゃないけど動作確認できたので まっ、いいか。
ITEM_ID で検索するのは実用的じゃないので、ITEMSearch 作って domain と View を今度作れればいいですね。