EventMachine :: HttpRequest и Keep-alive соединение - PullRequest
2 голосов
/ 30 сентября 2011

Я использую следующий код для запуска пары HTTP-запросов, но второй запрос (req2) всегда возвращается к ошибке.

Я что-то упускаю здесь очевидное?

request_options = {
  :body => " ",
  :keepalive => true,
  :head => {
    'content-type' => 'application/json',
    'accept' => 'application/json',
    'Accept-Encoding' => 'gzip,deflate,sdch'
  }
}

EM.run do
  request_options[:path] = '/default/path'

  conn = EM::HttpRequest.new 'https://www.example.com'

  req1 = conn.post request_options
  req1.errback { p 'Uh, oh'; EM.stop }
  req1.callback do
    doc = JSON.parse req1.response

    # do stuff with doc

    request_options[:body] = 'post-data'
    request_options[:path] = '/new/path'

    req2 = conn.post request_options
    req2.errback { p 'Uh, oh'; EM.stop }
    req2.callback do
       puts req2.response
       EM.stop
    end
  end
end

Ответы [ 2 ]

3 голосов
/ 30 сентября 2011

Я решил свою проблему с помощью EM-Synchrony

gem install em-synchrony

Установив этот гем, я мог бы использовать следующий код, чтобы заставить код работать так, как я ожидал.

request_options = {
  :body => " ",
  :keepalive => true,
  :head => {
    'content-type' => 'application/json',
    'accept' => 'application/json',
    'Accept-Encoding' => 'gzip,deflate,sdch'
  }
}

EM.synchrony do
  request_options[:path] = '/default/path'

  conn = EM::HttpRequest.new 'https://www.example.com'

  req1 = conn.post request_options
  doc = JSON.parse req1.response

  # do stuff with doc

  request_options[:body] = 'post-data'
  request_options[:path] = '/new/path'

  req2 = conn.post request_options
  puts req2.response

  EM.stop
end

Полагаю, меня просто смутило то, как EM.run выполняет асинхронные запросы и di.

0 голосов
/ 12 февраля 2015

Нельзя использовать один и тот же объект соединения внутри ответного обратного вызова.

Убедитесь, что вы создали новый EM::HttpRequest.new 'https://www.example.com' для второго запроса.

...