4. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
Ruby 標準ライブラリでの HTTPリクエスト
Net::HTTP
とても機能豊富なリッチな API
POST、PUT、PATCH、DELETE
コネクションの使いまわし
プロキシの利用
ベーシック認証
HTTPリクエストヘッダの設定
多くの場合ここまでの機能は不要
リダイレクトの処理とか、面倒だからあまりオススメできない
3
uri = URI('http://example.com/some_path?query=string')
body = Net::HTTP.get(uri)
5. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
Net::HTTP 4
uri = URI('http://example.com/some_path?query=string')
# Net::HTTP.get
body = Net::HTTP.get(uri)
# Net::HTTP.get_response
res = Net::HTTP.get_response(uri)
puts res.body if res.is_a?(Net::HTTPSuccess)
# Net::HTTP::Get
res = Net::HTTP.start(uri.hostname, uri.port) do |http|
req = Net::HTTP::Get.new(uri)
http.request(req)
end
puts res.body if res.is_a?(Net::HTTPSuccess)
6. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
net/http のリダイレクト処理(ruby-doc での例) 5
def fetch(uri_str, limit = 10)
# You should choose a better exception.
raise ArgumentError, 'too many HTTP redirects' if limit == 0
response = Net::HTTP.get_response(URI(uri_str))
case response
when Net::HTTPSuccess then
response
when Net::HTTPRedirection then
location = response['location']
warn "redirected to #{location}"
fetch(location, limit - 1)
else
response.value
end
end
print fetch('http://www.ruby-lang.org')
7. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
6open-uri
open を使って簡単に HTTPアクセスできる
Ruby の既存メソッドの再定義機能を使った初期の好例
一般に知られるよりもはるかに高機能
ただ、GET以外(POST等)のリクエスト等はできない
カンタンな例
open("http://www.ruby-lang.org/") {|f|
f.each_line {|line| p line}
}
# open の返り値を使う例
body = open("http://www.ruby-lang.org/") {|f| f.read }
body = open("http://www.ruby-lang.org/", &:read)
# URI を使う例
uri = URI("http://www.ruby-lang.org/en/")
body = uri.read