2012-07-07 101 views
3

Net::HTTP支持異步語法嗎?Ruby異步網:: HTTP?

我正在尋找類似下面的代碼。

該塊將被調用主線程上Net::HTTP之後任一接收到來自服務器的響應(在這種情況下,errornil)或遇到連接到服務器的錯誤(在這種情況下responsenil) 。

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 

以下問題提供了答案,但我正在尋找基於塊的解決方案。

回答

4

看一看在eventmachineem-http-request寶石。相當於你的上述代碼將是

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 

em-http-request Github page有一個很好的例子使用光纖。

編輯:我也建議你閱讀http://www.igvita.com/2009/05/13/fibers-cooperative-scheduling-in-ruby/

+0

這是一個很好的例子,但在測試一個雙重否定似乎是一個壞主意。測試'== HTTP_OK'然後'else'會更容易遵循。現在成功的條件是「如果不行」。 – tadman 2012-07-24 17:39:21

+0

@tadman謝謝!你是對的,解決這個問題。我想我儘可能地反映了op的代碼結構。 – 2012-07-24 18:40:06