Question 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?


203
2018-01-02 23:19


origine


Réponses:


Vous pouvez utiliser Ruby Net::HTTP classe:

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

292
2018-01-02 23:29



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


96
2018-01-02 23:39



OpenURI est le meilleur; c'est aussi simple que

require 'open-uri'
response = open('http://example.com').read

85
2017-07-14 17:52



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

69
2018-01-02 23:23



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 à quel point les clients Google et Twitter sont à court de 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'appeler simplement depuis le contrôleur.


12
2018-01-02 23:53



Mes deux façons préférées de récupérer le contenu des URL sont soit OpenURI ou Typhoïde.

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


8
2018-01-03 03:22



Voici le code qui fonctionne si vous effectuez un appel api REST 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

6
2017-08-03 21:03