Hotpepper API Ruby向けラッパーを作ってみました
January 15, 2007 4:13 PM by funami
昨年末にオープンした、ホットペッパーAPIのRubyラッパーを作ってみました。
Ruby on Railsから、使いたくて、作り始めています。
サンプル
このライブラリを使った、簡単な、サンプルは、こちらをご覧ください。http://tatamilab.jp/~funami/hotpepper/search.cgi
○フリーワード検索
○リンク生成
・同エリア+フリーワード検索
・ジャンル+フリーワード検索
・ページング
のサンプルになっています。
使い方
ソース一式はこちら サンプルとしては、こんな感じです。require 'lib/hotpepper_api' require 'kconv' hotp = HotpepperAPI::Gourmet.new result = hotp.search()
print result.pager.number_of_results #該当する全件数 print result.pager.display_per_page #1ページあたりの件数 print result.pager.display_from #ページの開始位置
result.items.each do |item|
print item.shop_name.tosjis << "\n"
print item.shop_address.tosjis << "\n"
end
print "前のページ=#{result.pager.prev.to_s}\n"
print "現在のページ=#{result.pager.current.to_s}\n"
print "次のページ=#{result.pager.next.to_s}\n"
XMLからRubyオブジェクトにする
RubyでXMLから、Rubyオブジェクトを生成する方法がよくわからず、当初は、REXMLで生成したオブジェクトに対して、Xpathでループまわしていました。しかし、この方法だと、生成コストがすごくかかるようで、使いものにならないくらい遅かったです。
いろいろ調べた結果、RAA - ruby-amazonのソースを参考にして、以下のようなソースで高速化できることがわかりました。
doc = REXML::Document.new(body).elements['Results']
@result = ResultSet.new(request)
parse(doc,@result)
def parse(doc,result)
result.pager.number_of_results = doc.elements['NumberOfResults'].text.to_i
result.pager.display_per_page = doc.elements['DisplayPerPage'].text.to_i
result.pager.display_from = doc.elements['DisplayFrom'].text.to_i
doc.elements.each('Shop') do |item|
shop = Shop.new
item.elements.each do |property|
if property.has_elements?
if property.name == 'PictureUrl'
value = parse_picture_url property
end
else
value = property.text
end
iv = uncamelise(property.name)
shop.instance_variable_set("@#{iv}".to_sym, value)
end
result.items << shop
end
return result
end
詳細は、ソースを参考にしてみてください。なお、マスター系は未実装です。 追記: [code reading][ruby] hotpepper_api.rbを読むでコードの解説をしていただいています。 どうもありがとうございます。カメログさんどうもありがとうございます。
TRACKBACK URL:
TRACKBACKS
? 書評 - 技術の by カメログ 書評 - 技術の伝え方 http://app.blog.livedoor.jp/dankogai/tb.cgi/50740514 本書はわずか189...

