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

Je voudrais prendre des informations d’un autre site Web. 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 le faire en Ruby on 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:

  • HTTP Gem
  • HTTParty
  • RestClient
  • Excon
  • Feedjira (RSS seulement)

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 sur 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 mixin pratique qui vous donne 90% de ce dont vous avez besoin. Voyez combien les clients Google et Twitter sont courts dans les 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 l’appellerais simplement depuis le contrôleur.

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

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

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

 require "uri" require 'net/http' proxy_host = '' proxy_port = '' proxy_user = '' proxy_pass = '' uri = URI.parse("https://saucelabs.com:80/rest/v1/users/") proxy = Net::HTTP::Proxy(proxy_host, proxy_port, proxy_user, proxy_pass) req = Net::HTTP::Get.new(uri.path) req.basic_auth(,) result = proxy.start(uri.host,uri.port) do |http| http.request(req) end puts result.body