net - ¿Cómo hacer una solicitud HTTP usando Ruby on Rails?
ruby http request (7)
Aquí está el código que funciona si está realizando una llamada a la API REST detrás de 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
Me gustaría tomar información de otro sitio web. Por lo tanto (tal vez) debería hacer una solicitud a ese sitio web (en mi caso, una solicitud GET de HTTP) y recibir la respuesta.
¿Cómo puedo hacer esto en Ruby on Rails?
Si es posible, ¿es un enfoque correcto para usar en mis controladores?
Net :: HTTP está integrado en Ruby, pero seamos sinceros, a menudo es más fácil no usar su incómodo estilo de los 80 y probar una alternativa de mayor nivel:
- Gema HTTP
- HTTParty
- RestClient
- Excon
- Feedjira (RSS solamente)
OpenURI es el mejor; es tan simple como
require ''open-uri''
response = open(''http://example.com'').read
Prefiero httpclient sobre Net :: HTTP.
client = HTTPClient.new
puts client.get_content(''http://www.example.com/index.html'')
HTTParty es una buena opción si está creando una clase que es un cliente para un servicio. Es una combinación conveniente que le brinda el 90% de lo que necesita. Vea cuán cortos son los clientes de Google y Twitter en los examples .
Y para responder a su segunda pregunta: no, no pondría esta funcionalidad en un controlador. En su lugar, usaría un modelo, si es posible, para encapsular los detalles (tal vez usando HTTParty) y simplemente lo llamaría desde el controlador.
Puedes usar la clase Net::HTTP
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
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'')