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>