November 11, 2007

Ruby入門:Web APIを使ってXMLを取得する










ほげおがそもそもRubyを勉強し始めたのは、最近流行の"Web API"や"マッシュアップ"によるウェブサイト構築を、Ruby on Railsのフレームワークを利用してやってみたい!というのが最初の動機。

地道にRubyの文法を覚え始めてきたので、そろそろウェブのリソースと連携してみようと思います。今回はそのよくあるサンプル例。











基本的にやりたいことは、今のレベルではこんなこと。


  1. ウェブサーバにリクエストを送って、何かしらの応答を取得する
  2. Web APIを叩いて、サーバから何かしらの応答を取得する
  3. サーバからXML形式で応答を取得し、そのデータを利用する


まずはサーバとお話ができなければならないので、基本的なコミュニケーションをとってみる。サンプルは下記のとおり。
環境によっては違ってくると思うけど、ほげおが利用しているロリポップでは下記のサンプルコードで動作します。





<サンプル>

#!/usr/local/bin/ruby -Ks

require 'rexml/document'
require 'open-uri'
require 'nkf'

print "Content-Type: text/html\r\n\r\n"

url = 'http://weather.livedoor.com'
path = '/forecast/webservice/rest/v1?city=70&day=tomorrow'
result = open(url + path)

doc = REXML::Document.new(result)

doc.elements.each ('lwws/') do |element|
puts NKF.nkf("-Ws", element.elements['title'].text)
end






このサンプルだけ見て「なるほど、わかったぞ!」と思ってくれる方にはこれ以上説明はいりませんが、詳しい説明が必要な人はこのまま下へ読み続けてください。












result = open(url)


open-uriのライブラリによって、openメソッドでURLを指定して、データを取得しています。
livedoor天気情報のWeb ApiによってXMLデータをリクエストする際のURLを、url変数とpath変数に分けて代入してあります。openメソッドに直接URLを指定してももちろんOKです。(ここでは可読性を考慮して横幅がスッキリするようにしているだけです。^^;)
これによってresult変数にXMLデータを入れることができます。



doc = REXML::Document.new(result)


rexml/documentのライブラリによって、XML形式のデータをXMLであると認識させた上で、doc変数に入れています。
これをしないと、XML形式に見えるただの文字データのままらしいですね。



doc.elements.each ('lwws/') do |element|
  puts NKF.nkf("-Ws", element.elements['title'].text)
end


rexml/documentのライブラリによってlwws階層のtitleエレメントを、nkfライブラリによってUTF-8に変換して、putsで出力しています。
「階層って何?」「エレメントて何?」となった人は、url変数に代入したURLをブラウザでリクエストしてみましょう。

http://weather.livedoor.com/forecast/webservice/rest/v1?city=70&day=tomorrow





そして最終的にlivedoor天気情報のサイトから、Web APIを叩いて取得したXMLデータから、任意の情報を取得/利用できるようになります。
サンプルで取得したデータは、下記のものになります。


神奈川県 横浜 - 明日の天気







ここまでなんとかこれたら、大きな階段を登ってきていると思います。