ruby on rails - solicitud http asincrónica en ruby
ruby-on-rails ruby-on-rails-3 (3)
Aquí hay un gran artículo que cubre el tema.
En general, las alternativas viables para usar hilos para esto serían el uso de una Fibers o podría usar em-http-request . En el último ejemplo, podría dejar de lado el manejo de devolución de llamada para su propósito particular.
require ''net/http''
urls = [
{''link'' => ''http://www.google.com/''},
{''link'' => ''http://www.facebook.com/''},
{''link'' => ''http://www.yahoo.com/''}
]
urls.each do |u|
u[''content''] = Net::HTTP.get( URI.parse(u[''link'']) )
end
print urls
Esto funcionará como código de procedimiento. Solo quiero conectarme a un servidor, sin problemas sobre el pedido. ¿Cómo puedo hacer eso en ruby? Una opción es usar hilos.
Aquí hay un ejemplo usando hilos.
require ''net/http''
urls = [
{''link'' => ''http://www.google.com/''},
{''link'' => ''http://www.facebook.com/''},
{''link'' => ''http://www.yahoo.com/''}
]
urls.each do |u|
Thread.new do
u[''content''] = Net::HTTP.get( URI.parse(u[''link'']) )
puts "Successfully requested #{u[''link'']}"
if urls.all? {|u| u.has_key?("content") }
puts "Fetched all urls!"
exit
end
end
end
¿Alguna mejor solución?
PD: - Quiero presionar Mixpanel, entonces es por eso que solo quiero hacer una llamada http y no esperar la respuesta.
El manejo Async liviano es el trabajo de Threads (como dijiste) o Fibers .
De lo contrario, debería considerar EventMachine que es una herramienta muy poderosa.
Si solo se trata de solicitudes HTTP simples en estilo asíncrono, probablemente Unirest sea la mejor Unirest para lograrlo.
La solicitud de Asnc es tan simple como:
response = Unirest.post "http://httpbin.org/post",
headers:{ "Accept" => "application/json" },
parameters:{ :age => 23, :foo => "bar" } {|response|
response.code # Status code
response.headers # Response headers
response.body # Parsed body
response.raw_body # Unparsed body
}