Amazon Product Adv. API でもう少し
先日、Amazon Product Advertisng API の Java コマンドタイプのサンプルを Grails で動かしてみようと ItemLookup のサービスとコントローラ、ドメイン、ビューを作ったのですが、今朝からもう少し進めて ItemSearch のコントローラ、ビューを作ってみました。ドメインはデータ保存しないので今のところ必要ないかな。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | /** * Amazon Product Advertising API を使ったサンプル * API Version: 2009-03-31 * ItemSearch-Keywords で Book名を入手 とりあえず。 * */ package com.yuruyakana import com.amazon.advertising.api.sample.SignedRequestsHelper import org.codehaus.groovy.grails.commons.* import net.sf.ehcache.Element class AmazonItemSearchService { boolean transactional = false String AWS_ACCESS_KEY_ID String ASSOCIATE_TAG String AWS_SECRET_KEY String ENDPOINT def getItemSearch(searchIndex, keyword) { /* 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 return } String requestUrl = null String titles = "_" String author = null String imageUrl = null String price = null String totalresults = null // map形式 println "Map form example:" Map params = new HashMap() params.put("Service", "AWSECommerceService") params.put("Operation", "ItemSearch") params.put("AWSAccessKeyId", AWS_ACCESS_KEY_ID) params.put("AssociateTag", ASSOCIATE_TAG) params.put("SearchIndex", searchIndex) params.put("Keywords", keyword) /** こっちの方が良いわな def params = ['Service':'AWSECommerceService', 'Operation':'ItemSearch', 'AWSAccessKeyId':'AWS_ACCESS_KEY_ID', 'AssociateTag':'ASSOCIATE_TAG', 'ResponseGroup':'Medium'] */ requestUrl = helper.sign(params) // XML構文解析 def uri = requestUrl.toURI().toString() def ItemSearchResponse = new XmlSlurper().parse(uri) println "Total Results: " + ItemSearchResponse.Items.TotalResults //println "Total Pages: " + ItemSearchResponse.Items.TotalPages ItemSearchResponse.Items.Item.ItemAttributes.Title.each{ // リストをコントローラに渡す方法思いつかなかったのでアンダー // スコアで芋づるにしちゃいました。 titles = titles + "_" + it } //println "ITEM Author: " + ItemSearchResponse.Items.Item.ItemAttributes.Author //println "ITEM Medium Image: " + ItemSearchResponse.Items.Item.MediumImage.URL //println "ITEM Price: " + ItemSearchResponse.Items.Item.ItemAttributes.ListPrice.FormattedPrice totalresults = ItemSearchResponse.Items.TotalResults def map = [TotalResults:totalresults, Title:titles] return map } } /** * Amazon Product Advertising API を使ったサンプル * API Version: 2009-03-31 * keyword で Book名リストを入手 とりあえず。 * */ package com.yuruyakana class AmazonItemSearchController { //def scaffold = AmazonItemSearch def AmazonItemSearchService String searchIndex = "Books" String keyword = "IT経営" def index = { redirect(action:"search") } def searchFlow = { // 検索 search { on("doSearch") { def amazonBook = amazonItemSearchService.getItemSearch(searchIndex, keyword) /** * サービスからの戻り値を配列で渡す方法分からないので、リストをアンダー * </code><code>スコアでつないで</code><code>マップで渡して、ここでまたスプリットにかけています。 * Groovy の each メソッドはすごい。 */ amazonBook.Title.splitEachLine("_") {titles-> titles.each{ //println it //render(view:'search', model:[keyword:keyword, Title:titles]) } ["keyword":keyword, "Title":titles] } }.to "search" } // 詳細 displayDetail { on("search"){ }.to "search" } } } |
ビューはこんな感じ。
さて、次は何をしましょうか?
カートを付けて、plugin とか、GAE 上で実験してみるとか?


![[Google]]( http://www.yuruyakana.com/blog/wp-content/plugins/easy-adsenser/google-light.gif)