API仕様の調査が目的なので、素直に、APIが提供している機能をWEBページから実行できるようにしただけのサンプル。
ActiveResourceでWeb APIにアクセスする方法は、こちらのサイト
ActiveResource の使い方(後編) : 一般の Web API にアクセスする
のコードを参考に・・・というより、コピペして使わせて頂いた。
いつもお世話になります。
APIにアクセスするActiveResourceクラスは以下。
app/model/ma_service/word.rb
class MaService::Word < ActiveResource::Base
class Format
def extension() '' end
def mime_type() 'application/xml' end
def encode(hash, options = {}) hash.to_xml(options) end
def decode(xml)
data = Hash.from_xml(xml)
if data['ResultSet']['ma_result']
data = Hash.from_xml(xml)['ResultSet']['ma_result']['word_list']['word']
elsif data['ResultSet']['uniq_result']
data = Hash.from_xml(xml)['ResultSet']['uniq_result']['word_list']['word']
end
data.is_a?(Hash) && data.keys.size == 1 ? data.values.first : data
end
end
self.site = 'http://jlp.yahooapis.jp'
self.format = Format.new
class << self
def collection_path(prefix_options = {}, query_options = nil)
prefix_options, query_options = split_options(prefix_options) if query_options.nil?
"/MAService/V1/parse#{query_string(query_options)}"
end
end
end
ポイントになるのはもちろん、
- リクエストURIのビルド
- レスポンスのActiveResourceへのマップ(要はXML to Hash変換)
の2点。
1.については、WordクラスのコレクションURIがそのままAPIへのリクエストURIとなるようにcollection_pathをカスタマイズしている。
2.を実装するのが、Formatクラスのdecode(xml)メソッドになる。xmlパーサを書く必要はなく、Hash.from_xml(xml)メソッドへパース処理を委譲すればよい。レスポンスのword要素(繰り返し項目)がこのWordクラスに相当する。パース処理の後、階層を辿ってword要素(というよりHashなのでword'キー'?)を見つけ出す。
Yahoo! API はリクエスト受付けにGETとPOSTの両方を提供しているが、データ取得にPOSTを使用するのはRESTに反するため、このサンプルではGETリクエストのみを使用する(つまり、ActiveResource::find())。GETリクエストの場合、当然ながら解析対象テキストの長さはURIの最大長までという制限がつく。こればっかりは諦めるしかない。
Wordクラス(ActiveResource)は、コントローラ内でこう使う。:paramsにリクエストパラメータを与える。ActiveRecordeのfindメソッドに:conditionを与えるようなもの。
@result_set << MaService::Word.find(:all, :params=>req_params)
0 件のコメント:
コメントを投稿