2011-09-30 69 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'