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 はプログレスバーのために 利用されることを想定しています。
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ヘッダを収録したハッシュを返します。