http/ftp に簡単にアクセスするためのクラスです。 Kernel のモジュール関数(組み込み関数) open を再定義します。
http/ftp の URL を、普通のファイルのように開けます。
require 'open-uri' open("http://www.ruby-lang.org/") {|f| f.each_line {|line| p line} }
開いたファイルオブジェクトは StringIO もしくは Tempfile ですが OpenURI::Meta で拡張されていて、 メタ情報を獲得するメソッドが使えます。
open("http://www.ruby-lang.org/en") {|f| f.each_line {|line| p line} p f.base_uri # <URI::HTTP:0x40e6ef2 URL:http://www.ruby-lang.org/en/> p f.content_type # "text/html" p f.charset # "iso-8859-1" p f.content_encoding # [] p f.last_modified # Thu Dec 05 02:45:02 UTC 2002 }
ハッシュ引数で、追加のヘッダフィールドを指定できます。
open("http://www.ruby-lang.org/en/", "User-Agent" => "Ruby/#{RUBY_VERSION}", "From" => "foo@bar.invalid", "Referer" => "http://www.ruby-lang.org/") {|f| ... }
http_proxy や ftp_proxy などの環境変数は、デフォルトで有効になっています。 プロキシを無効にするには :proxy => nil とします。
open("http://www.ruby-lang.org/en/raa.html", :proxy => nil) {|f| ... }
URI オブジェクトも似たような方法で開けます。
uri = URI.parse("http://www.ruby-lang.org/en/") uri.open {|f| ... }
URI オブジェクトは直接読み込むことができます。 戻り値の文字列は、OpenURI::Meta で拡張されています。
str = uri.read p str.base_uri
Kernel.open(name, *rest)
Kernel.open(name, *rest){|ouri| ...}
'open-uri' を require すると、Kernel.open が再定義されます。
name が http:// や ftp:// で始まっている文字列なら URI のリソースを
取得した上で StringIO オブジェクトとして返します。この StringIO
オブジェクトは OpenURI::Meta で拡張されています。
*rest
で受け付けるオプションに関しては、
OpenURI.open_uri を参照して下さい。
name に open メソッドが定義されている場合は、*rest を引数として渡し name.open(*rest, &block) のように name の open メソッドが呼ばれます。 これ以外の場合は、name はファイル名として扱われ、従来の Kernel#open が呼ばれます。
require 'open-uri' sio = open('http://www.example.com') p sio.is_a?(OpenURI::Meta) # => true p sio.content_type puts sio.read
ブロックを与えた場合は上の場合と同様、name が http:// や ftp:// で 始まっている文字列なら URI のリソースを取得した上で StringIO オブジェクトを 引数としてブロックを評価します。後は同様です。
OpenURI::OpenRead をインクルードします。
OpenURI::OpenRead をインクルードします。
OpenURI.open_uri(name [, mode [, perm]] [, options])
OpenURI.open_uri(name [, mode [, perm]] [, options]){|sio| ... }
URI である文字列 name のリソースを取得して StringIO オブジェクト として返します。 与えられた mode が書き込みモードであった場合は、例外 ArgumentError を投げます。 perm は与えても無視されます。
require 'open-uri' sio = OpenURI.open_uri('http://www.example.com') puts sio.read OpenURI.open_uri('http://www.example.com'){|sio| sio.read }
ブロックを与えた場合は StringIO オブジェクトを引数としてブロックを 評価します。
options には Hash を与えます。解釈するハッシュの キーは :proxy, :progress_proc, :content_length_proc です。HTTP でのみ意味があります。
キー :proxy の値には以下のいずれかを与える。
nil => Proxy を用いない。
require 'open-uri' sio = OpenURI.open_uri('http://www.example.com', { :proxy => 'http://proxy.example.com:8000/' })
キー :content_length_proc の値にはブロックを与えます。ブロックは対象となる URI の Content-Length を引数として実際の転送が始まる前に評価されます。返り値は特に 利用されません。
キー :progress_proc の値にはブロックを与えます。ブロックは対象となる URI からデータの 断片が転送されるたびに、その断片のサイズを引数として評価されます。返り値は特に 利用されません。
上の2つ :content_length_proc と :progress_proc はプログレスバーのために 利用されることを想定しています。
Options
Hash オブジェクト。open_uri が解釈するオプションのデフォルトです。
open(*rest, &block)
OpenURI.open_uri(self, *rest, &block) と同じです。
read(options={})
self.open(options={}).read と同じです。 このメソッドによって返される文字列は OpenURI::Meta によって拡張されています。
require 'open-uri' uri = URI.parse('http://www.example.com/') str = uri.read p str.is_a?(OpenURI::Meta) # => true p str.content_type
last_modified
対象となる URI の最終更新時刻を Time オブジェクトで返します。
content_type
対象となる URI の Content-Type を文字列で返します。
charset
対象となる URI の文字コードを Content-Type の文字コード情報を文字列で返します。
open("http://www.ruby-lang.org/en"){|f| p f.content_type # => "text/html" p f.charset # => "iso-8859-1" }
content_encoding
対象となる URI の Content-Encoding を文字列の配列として返します。
status
対象となる URI のステータスコードと reason phrase を文字列の配列として返します。
base_uri
リダイレクトされた後のデータが存在する URI を URI オブジェクトとして返します。
meta
ヘッダを収録したハッシュを返します。