読者です 読者をやめる 読者になる 読者になる

【Rails】Railsでプロキシを通しつつ、楽天APIにアクセスする

参考サイトは以下です
http://d.hatena.ne.jp/toyoshi/20100414/1271214117
楽天API
http://webservice.rakuten.co.jp/api/itemsearch/

以下、参考サイトほぼそのまんまですが…
違うのは、私が使おうとしているのは、"楽天ブックスAPI"という処です。
model辺りが割と違う・参考サイト通りにやると、指定する値などが微妙に違ってエラーとなるので注意です。
(controller名などは参考サイトのままになっています)

/controller

class ItemsController < ApplicationController
  def index
    @items = Rakuten.item_search("検索ワード")
  end
end

/model/rakuten.rb

ruby script/generate model Rakuten

をして、modelを作成後、rakuten.rbを以下のように書き換えます。

class Rakuten < ActiveResource::Base
  self.site     = "http://api.rakuten.co.jp/" #リソースのURL
  self.format   = :xml #リソースのフォーマット
  self.proxy    = "プロキシサーバ指定" #プロキシを通すときは指定します
  #AFFILIATE_ID  = ""
  DEVELOPER_ID  = "自分で入力"
  VERSION       = "2010-03-18" #参考サイトから変更
  FROM          = "/rws/3.0/rest" #参考サイトから変更

  def self.item_search(keyword, genre_id=0, page=1)
    self.find(
      :one,
      :from => FROM,
      :params => {
        :developerId  =>  DEVELOPER_ID,
        #:affiliateId  =>  AFFILIATE_ID,
        :version      =>  VERSION,
        :operation    =>  "BooksBookSearch",#使用APIの指定
        #:genreId      =>  genre_id,
        #:page         =>  page,
        :title      =>  "test".toutf8
      }
    )
  end
end

/view

<% @items.Body.BooksBookSearch.Items.Item.each do |item| %>
  <div><%= item.title %></div>
<% end %>

このようにすると、結果の商品名の羅列が出来ます。

楽天ブックスAPIでないときは、返ってくる値の名前(ブックス系だと、商品名がtitleなのに対し、市場系だとitemNameである等)があるので、気をつけます。

↑のviewはブックス系APIだったので、そのようにしましたが、参考サイトでは以下のようになっています。

<% @items.Body.ItemSearch.Items.Item.each do |item| %>
  <%= item.itemName  %><br>
<% end %>

例えば エラーのお話

script/consoleで、

test = Rakuten.search(“a”)

などとして、適当にAPIでaを検索します。
その時にtestの中に以下のように返ってきたときは、失敗しています。

=> #<Rakuten:0x6ea5870 @prefix_options={}, @attributes={"Header"=>#<Rakuten::Hea
der:0x6ea2490 @prefix_options={}, @attributes={"Status"=>"ClientError", "StatusM
sg"=>"version繝代Λ繝。繝シ繧ソ縺梧欠螳壹&繧後※縺・∪縺帙s縲Wersion繝代Λ繝。繝シ
繧ソ縺ォ縺ッ[2009-04-15, 2010-06-30, 2010-08-05, 2010-09-15]縺梧欠螳壼庄閭ス縺ァ縺吶&#128;
・, "Args"=>#<Rakuten::Header::Args:0x6ea1b58 @prefix_options={}, @attributes={"
Arg"=>["true", "true", "true", "false"]}>}>}>

ちょっと文字化けしちゃってるのは申し訳ないですが…
よく見ると、一番下の方に、

Arg"=>["true", "true", "true", "false"]

こんなのがあります。
これが1つでもfalseになっていると、失敗しているということなので、帰ってきた結果の様子がおかしい時はこれを見ます。
これは、APIを叩くときに指定する値などが間違っていたり、足りていなかったりするときのようです。