Как сделать HTTP-запрос с использованием Ruby on Rails? - PullRequest
229 голосов
/ 03 января 2011

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

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

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

Ответы [ 8 ]

316 голосов
/ 03 января 2011

Вы можете использовать Руби 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
106 голосов
/ 03 января 2011

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

90 голосов
/ 14 июля 2013

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

require 'open-uri'
response = open('http://example.com').read
76 голосов
/ 03 января 2011
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')
13 голосов
/ 03 января 2011

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

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

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

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

8 голосов
/ 04 августа 2014

Вот код, который работает, если вы делаете вызов REST 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
8 голосов
/ 03 января 2011

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

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

0 голосов
/ 21 марта 2019

Использование камня nice_http https://github.com/MarioRuiz/nice_http

Вы можете сделать это в одну строку:

require 'nice_http'
content = NiceHttp.new("http://www.example.com").get("/index.html").data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...