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

次の質問は答えを提供しますが、ブロックベースのソリューションを探しています.

4

1 に答える 1

5

eventmachineem-http-requestgemsをご覧ください。上記のコードに相当するものは次のようになります

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-requestGithub ページにファイバーを使用した非常に良い例があります。

編集:http : //www.igvita.com/2009/05/13/fibers-cooperative-scheduling-in-ruby/も読むことをお勧めします

于 2012-07-07T08:24:31.833 に答える