2012-07-07 57 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