web-dev-qa-db-fra.com

Comment faire une requête HTTP en utilisant Ruby sur Rails?

Je voudrais prendre des informations d'un autre site. Par conséquent (peut-être) je devrais faire une demande à ce site Web (dans mon cas une demande HTTP GET) et recevoir la réponse.

Comment puis-je faire cela dans Ruby sur Rails?

Si c'est possible, est-ce une approche correcte à utiliser dans mes contrôleurs?

231
user502052

Vous pouvez utiliser la classe Net::HTTP de Ruby:

_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
_
321
João Silva

Net :: HTTP est intégré à Ruby, mais avouons-le, il est souvent plus facile de ne pas utiliser son style encombrant des années 1980 et d'essayer une alternative de niveau supérieur:

106
stef

OpenURI est le meilleur; c'est aussi simple que

require 'open-uri'
response = open('http://example.com').read
90
user2454031
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')
76

Je préfère httpclient à Net :: HTTP.

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

HTTParty est un bon choix si vous créez une classe qui est un client pour un service. C'est un mix pratique qui vous donne 90% de ce dont vous avez besoin. Voyez combien les clients Google et Twitter sont courts dans le exemples .

Et pour répondre à votre deuxième question: non, je ne mettrais pas cette fonctionnalité dans un contrôleur. J'utiliserais plutôt un modèle si possible pour encapsuler les détails (peut-être en utilisant HTTParty) et simplement l'appeler depuis le contrôleur.

13
Mark Thomas

Voici le code qui fonctionne si vous effectuez un appel REST api derrière un proxy:

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
machzqcq

Mes deux méthodes préférées pour récupérer le contenu des URL sont soit OpenURI ou Typhoeus .

OpenURI parce que c'est partout et Typhoeus parce que c'est très flexible et puissant.

8
the Tin Man

Utiliser Nice_http gem https://github.com/MarioRuiz/Nice_http

Vous pouvez le faire en une seule ligne:

require 'Nice_http'
content = NiceHttp.new("http://www.example.com").get("/index.html").data
0
Mario Ruiz