Ruby OpenURIの使い方

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_uriopenで取得したオブジェクトは次のようなメソッドが使えます。

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例外が発生するので、次のようにbeginrescueしておきます。

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>