Ruby 异步网络::HTTP?

ma1*_*w28 4 ruby asynchronous block net-http

是否Net::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
Run Code Online (Sandbox Code Playgroud)

以下问题提供了答案,但我正在寻找基于块的解决方案。

Pat*_*ity 5

看看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
Run Code Online (Sandbox Code Playgroud)

em-http-requestGithub页面上有一个很好的使用纤维的例子。

编辑:我还建议阅读http://www.igvita.com/2009/05/13/fibers-cooperative-scheduling-in-ruby/