Ruby HTTP get/post

Simple get

Простая функция для отправки http get.

def get(request)
request = CGI::escape(request)
uri = URI("http://#{$server}/#{request}")
Net::HTTP.get(uri)
end

Get with header

Пример запроса с header. Обращаю внимание, что в старой версии ruby 1.9.3 обязательно нужно к uri применить метод .request_uri, в новых не обязательно.

uri = URI("http://test-api.net/login=#{login}")
req = Net::HTTP::Get.new(uri.request_uri)
req['Auth-Token'] = "my_token"
res = Net::HTTP.start(uri.hostname, uri.port) {|http|
  http.request(req).body
}

Get with timeout

Если при http_get выдает ошибку Timeout rescue in rbuf_fill – пробуем увеличить таймаут. Так же в каких-то кейсах имеет смысл выставить max_retries в 2-3 (по умолчанию 1). Код сложнее первого и не так очевиден.

net/protocol.rb:141:in read_nonblock
net/protocol.rb:141:in rbuf_fill
net/protocol.rb:122:in readuntil
net/protocol.rb:132:in readline
net/http.rb:2563:in read_status_line
net/http.rb:2552:in read_new
net/http.rb:1320:in block in transport_request
net/http.rb:1317:in catch
net/http.rb:1317:in transport_request
net/http.rb:1294:in request

def get_new(request)
request = CGI::escape(request)
uri = URI("http://#{$server}/#{request}")
request = Net::HTTP::Get.new(uri.path)
res = Net::HTTP.start(uri.hostname, uri.port, :read_timeout => 500) do |http|
http.request(request)
end
res.body
end

Leave a Reply