Come fare una richiesta HTTP usando Ruby on Rails?

Vorrei prendere informazioni da un altro sito web. Pertanto (forse) dovrei fare una richiesta a quel sito Web (nel mio caso una richiesta HTTP GET) e ricevere la risposta.

Come posso fare questo in Ruby on Rails?

Se è ansible, è un approccio corretto da usare nei miei controller?

Net: HTTP è incorporato in Ruby, ma ammettiamolo, spesso è più facile non usare il suo ingombrante stile anni ’80 e provare un’alternativa di livello superiore:

  • Gemma HTTP
  • HTTParty
  • RestClient
  • Excon
  • Feedjira (solo RSS)

OpenURI è il migliore; è semplice come

 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') 

Preferisco httpclient su Net :: HTTP.

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

HTTParty è una buona scelta se stai facendo una class che è un client per un servizio. È un mixin conveniente che ti dà il 90% di quello che ti serve. Scopri quanto sono brevi i client Google e Twitter negli esempi .

E per rispondere alla tua seconda domanda: no, non metterei questa funzionalità in un controller: utilizzerei invece un modello, se ansible, per incapsulare i particolari (magari usando HTTParty) e semplicemente chiamarlo dal controller.

I miei due modi preferiti per afferrare il contenuto degli URL sono OpenURI o Typhoeus .

OpenURI perché è ovunque, e Typhoeus perché è molto flessibile e potente.

Ecco il codice che funziona se stai effettuando una chiamata a REST api dietro 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