RubyのOpenURIを使うとhttpやftpでネットワーク上のリソースを取得することができます。
リファレンスはこちらです。module OpenURI。
基本的な使い方
はじめにopen-uriを読み込みます。
require 'open-uri'
OpenURI.open_uriメソッドにURIを渡してリソースを取得します。取得したリソースはreadで参照できます。
io = OpenURI.open_uri('http://www.example.com')
puts io.read
OpenURI.open_uriメソッドはブロックを取ることもできます。
OpenURI.open_uri('http://www.example.com') { |io|
puts io.read
}
ただのopenでも同じことができます。
open('http://www.example.com') { |io|
puts io.read
}
取得したオブジェクトの扱い
open_uriやopenで取得したオブジェクトは次のようなメソッドが使えます。
read
内容を文字列として返します。
open('http://www.example.com') { |io|
puts io.read
}
#=> "<!doctype html>
<html>
省略
</html>"
base_uri
リダイレクトも加味したリソースのURIを返します。
open('http://www.example.com') { |io|
puts io.base_uri
}
#=> "http://www.example.com"
charset
文字コードを返します。
open('http://www.example.com') { |io|
puts io.charset
}
#=> "iso-8859-1"
content_encoding
Content-Encoding ヘッダの内容を返します。ない場合は空の配列が返ります。
open('http://www.example.com') { |io|
puts io.content_encoding
}
#=> ""
content_type
Content-Type ヘッダの内容を返します。ない場合は”application/octet-stream” を返します。
open('http://www.example.com') { |io|
puts io.content_type
}
#=> "text/html"
jpeg画像の場合は次のようになります。
#=> image/jpeg
last_modified
リソースの最終更新時刻が返ります。
open('http://www.example.com') { |io|
puts io.last_modified
}
#=> "2013-08-09 23:54:35 UTC"
meta
リソースのヘッダ情報がハッシュで返ります。
open('http://www.example.com') { |io|
p io.meta
}
#=> {"cache-control"=>"max-age=604800", "content-type"=>"text/html", "date"=>"Fri, 23 Sep 2016 14:41:37 GMT", "etag"=>"\"359670651+gzip\"", "expires"=>"Fri, 30 Sep 2016 14:41:37 GMT", "last-modified"=>"Fri, 09 Aug 2013 23:54:35 GMT", "server"=>"ECS (pae/3796)", "vary"=>"Accept-Encoding", "x-cache"=>"HIT", "x-ec-custom-error"=>"1", "content-length"=>"606"}
status
リソースのステータスコードが配列で返ります。
open('http://www.example.com') { |io|
p io.status
}
#=> ["200", "OK"]
エラー対応
指定したURLの先のリソースが見つからないときは、httpならOpenURI::HTTPError例外、ftpならNet::FTPError例外が発生するので、次のようにbegin–rescueしておきます。
begin
OpenURI.open_uri('http://www.example.com') { |io|
puts io.read
}
rescue => e
puts e # 例外メッセージ表示
end
例外メッセージは404の場合、次のようになります。
#<OpenURI::HTTPError: 404 Not Found>
リダイレクト対応
リダイレクトが発生する場合、OpenURIはデフォルトではリダイレクト先のリソースを取得します。
リダイレクト先までは読み込んで欲しくない場合は、:redirectオプションで動作を指定します。trueならリダイレクトあり、falseなら無しです。
OpenURI.open_uri('http://www.example.com', :redirect => false) { |io|
puts io.read
}
リダイレクト無しにしたときは、リダイレクト302を検出すると例外が発生します。
#<OpenURI::HTTPRedirect: 302 Found>