Ruby异步Net::HTTP?

4

Net::HTTP是否支持异步语法?

我正在寻找像下面这样的代码。

Net::HTTP收到来自服务器的响应(在这种情况下,error将是nil)或者遇到连接服务器的错误(在这种情况下response将是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

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

6

看一下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 页面上,有一个非常好的使用纤程的示例。

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


这是一个很好的例子,但测试双重否定似乎不是一个好主意。测试 == HTTP_OK 然后使用 else 更容易理解。现在成功条件是“如果不是不好”。 - tadman
@tadman 谢谢!你是对的,我已经修复了。我想我尽可能地试图反映OP的代码结构。 - Patrick Oscity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接