2011-09-30 70 views
2

我使用下面的代码来运行几个HTTP请求,但第二个请求(req2)总是返回到errback。EventMachine :: HttpRequest和Keep-alive连接

我失去的东西在这里很明显?

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 
+0

您可以尝试的一件快速事情是为两个请求使用'request_options'哈希的不同副本。这可能是因为'EM :: HttpRequest'是马虎,修改了它给出的选项哈希值(然后将修改后的哈希值传递给下一次调用,认为它就像您设置的那样,实际上它不同)。 – Theo

+0

感谢您的回答。我刚刚尝试过,但仍然返回到errback。 – pkhamre

+0

太糟糕了,如果真的那么简单(但我认为这不是一个正确的答案,因此评论)会很好。 – Theo

回答

3

我用EM-同步性

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

您不能在响应回调中使用相同的连接对象。

确保您为第二个请求创建了一个新的EM::HttpRequest.new 'https://www.example.com'