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?
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
_
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:
OpenURI est le meilleur; c'est aussi simple que
require 'open-uri'
response = open('http://example.com').read
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')
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.
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
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