« だちゃかん | トップページ | フライフィッシャーメン »

2007年6月 1日 (金)

楽天WEB SERVICEをRubyから呼び出してみる

Rubyの作者であるまつもとゆきひろ氏が楽天技術研究所のフェローに就任(楽天のプレスリリース/.-J)ということなので、Rubyで楽天WEB SERVICEのAPIを叩いてみた。

まず、超簡単なhttpクライアント。

require 'open-uri'

html = ''
url = "http://kyow.cocolog-nifty.com"
open(url) do |file|
html = file.read
end

print html

全く簡単だ。

このhttpクライアントで楽天WEB SERVICEの検索APIを叩いてみる。デベロッパーIDはここで取得しておくこと。

require 'open-uri'
require 'kconv'
require 'cgi'

xml = ''
developer_id = 'デベロッパーID'
search_string = "検索キーワード"
rakuten_api_uri = "http://api.rakuten.co.jp/rws/1.7/rest?developerId=#{developer_id}&operation=ItemSearch&version=2007-04-11&keyword=#{CGI.escape(search_string.toutf8)}"
open(rakuten_api_uri) do |f|
xml = f.read.tosjis
end

print xml

マーベラス!!

このサンプルはWindows環境で動作させたので、文字コードをShift_JISとUTF-8間で変換している。

REST方式のAPIを呼び出しているので、戻り値はXMLとなる。あとは、戻ってきたXMLをparseすれば良いんだけど…せっかく楽天WEB SERVICEはJSON形式でも値を返せるんだし、XMLよりも軽量であることを考えて、JSONのAPIを呼び出することにする。セキュリティの問題を置いておくとJavaScriptで直接扱えて、Ajaxとも相性が良さそうだしね。

で、JSON parserにはWebOS GoodiesSimple JSON parser & builderを使用することにする。コード量が少なくて簡単に扱えそうなので。これをダウンロードしてjsonparser.rbという名前で保存し、こんな感じに。

require 'open-uri'
require 'kconv'
require 'cgi'
require 'jsonparser.rb'

def out(obj)
if obj.is_a? Hash
obj.each_key {|k|
print "key = #{k}\n"
out obj[k]
}
elsif obj.is_a? Array
obj.each {|i|
print "\n"
out i
}
else
if obj.is_a? String
obj = obj.tosjis
end
print "value = #{obj}\n"
end
end

json_string = ''
developer_id = 'デベロッパーID'
search_string = "検索キーワード"
rakuten_api_uri = "http://api.rakuten.co.jp/rws/1.7/json?developerId=#{developer_id}&operation=ItemSearch&version=2007-04-11&keyword=#{CGI.escape(search_string.toutf8)}"
open(rakuten_api_uri) {|f|
json_string = f.read
}

parser = JsonParser.new
obj = parser.parse(json_string)

out obj

Simple JSON parser & builderがparseした結果は「ハッシュと配列が入れ子になったオブジェクト」なので、それを表示するためのコード(outメソッド)が全体のほとんどを占めている。単にオブジェクトの中身を単に見るだけなら、再帰を使わなくてもinspectするだけで良い。

|

« だちゃかん | トップページ | フライフィッシャーメン »

Ruby」カテゴリの記事

コメント

こんにちは、 WebOS Goodies を書いている歩行者と申します。
JSON クラス、ご利用ありがとうございます!
まさにこういうことに使ってほしかった、という感じです。
楽天APIは私も機会があれば試したいと思っていました。
挑戦するときは参考にさせていただきます。
それでは、今後ともよろしくお願いします。

投稿: 歩行者 | 2007年6月 1日 (金) 22:36

JSON Parser便利に使わさせていただきました。作者様の意図通りで安心しました。
今後もよろしくお願い致します。

投稿: kyow | 2007年6月 5日 (火) 00:06

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/16742/15276878

この記事へのトラックバック一覧です: 楽天WEB SERVICEをRubyから呼び出してみる:

« だちゃかん | トップページ | フライフィッシャーメン »