Как сделать запрос 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