Как сделать запрос HTTP с помощью Ruby on Rails?

Я хотел бы получить информацию с другого веб-сайта. Поэтому (возможно) я должен сделать запрос на этот сайт (в моем случае запрос HTTP GET) и получить ответ.

Как я могу сделать это в Ruby on Rails?

Если это возможно, это правильный подход к использованию в моих контроллерах?

Ответ 1

Вы можете использовать Ruby Net::HTTP класс:

require 'net/http'

url = URI.parse('http://www.example.com/index.html')
req = Net::HTTP::Get.new(url.to_s)
res = Net::HTTP.start(url.host, url.port) {|http|
  http.request(req)
}
puts res.body

Ответ 2

Net:: HTTP встроен в Ruby, но пусть сталкивается с этим, часто проще не использовать свой громоздкий стиль 1980-х и попробовать альтернативу более высокого уровня:

Ответ 3

OpenURI - лучший; это так же просто, как

require 'open-uri'
response = open('http://example.com').read

Ответ 4

require 'net/http'
result = Net::HTTP.get(URI.parse('http://www.example.com/about.html'))
# or
result = Net::HTTP.get(URI.parse('http://www.example.com'), '/about.html')

Ответ 5

Я предпочитаю httpclient через Net:: HTTP.

client = HTTPClient.new
puts client.get_content('http://www.example.com/index.html')

HTTParty - хороший выбор, если вы создаете класс, который является клиентом для службы. Это удобный микс, который дает вам 90% того, что вам нужно. Узнайте, как короткие клиенты Google и Twitter находятся в examples.

И чтобы ответить на ваш второй вопрос: нет, я бы не поставил эту функциональность в контроллер - вместо этого я бы использовал модель, чтобы по возможности инкапсулировать данные (возможно, используя HTTParty) и просто вызвать их из контроллера.

Ответ 6

Мои любимые два способа захватить содержимое URL-адресов: OpenURI или Typhoeus.

OpenURI, потому что он повсюду, и Typhoeus, потому что он очень гибкий и мощный.

Ответ 7

Вот код, который работает, если вы делаете RIP api-вызов за прокси:

require "uri"
require 'net/http'

proxy_host = '<proxy addr>'
proxy_port = '<proxy_port>'
proxy_user = '<username>'
proxy_pass = '<password>'

uri = URI.parse("https://saucelabs.com:80/rest/v1/users/<username>")
proxy = Net::HTTP::Proxy(proxy_host, proxy_port, proxy_user, proxy_pass)

req = Net::HTTP::Get.new(uri.path)
req.basic_auth(<sauce_username>,<sauce_password>)

result = proxy.start(uri.host,uri.port) do |http|
http.request(req)
end

puts result.body