2012-07-07 4 views
3

Est-ce que Net::HTTP prend en charge une syntaxe asynchrone?Ruby Asynchronous Net :: HTTP?

Je cherche quelque chose comme le code ci-dessous.

Le bloc obtiendrait appelé sur le thread principal après Net::HTTP a soit reçu la réponse du serveur (dans ce cas, error serait nil) ou rencontre une erreur de connexion au serveur (dans ce cas, response serait nil) .

Net::HTTP.get('http://stackoverflow.com') do |response, error| 
    if error 
    puts "Connection error: #{error.message}" 
    elsif response.status_code != HTTPOK 
    puts "Unexpected status code: #{response.status_code}" 
    puts response.body 
    else 
    puts "Success!" 
    puts response.body 
    end 
end 

Les questions suivantes fournissent des réponses, mais je suis à la recherche d'une solution basée sur des blocs.

Répondre

4

Jetez un oeil sur les pierres précieuses eventmachine et em-http-request. L'équivalent à votre code ci-dessus serait

require 'rubygems' 
require 'eventmachine' 
require 'em-http' 

HTTP_OK = 200 

EM.run do 
    http = EM::HttpRequest.new('http://example.com').get 

    http.errback do 
    puts "Connection error: #{http.error}" 
    EM.stop 
    end 

    http.callback do 
    if http.response_header.status == HTTP_OK 
     puts "Success!" 
     puts http.response 
    else 
     puts "Unexpected status code: #{http.response_header.status}" 
    end 
    EM.stop 
    end 
end 

Il est un très bon exemple en utilisant des fibres sur le em-http-request Github page.

Edit: Je recommande également la lecture http://www.igvita.com/2009/05/13/fibers-cooperative-scheduling-in-ruby/

+0

Ceci est un bon exemple, mais l'essai d'un double négatif semble être une mauvaise idée. Tester '== HTTP_OK' et ensuite' else' serait plus facile à suivre. À l'heure actuelle, la condition de réussite est «si ce n'est pas correct». – tadman

+0

@tadman merci! vous avez raison, réparé ceci. Je suppose que j'ai essayé de refléter la structure du code de l'op autant que possible. –