在响应完成之前对HTTP响应做出反应?

时间:2013-11-14 20:22:06

标签: ruby http

在HTTP会话完成/关闭之前以及从服务器获取整个结果之前,任何Ruby库是否可以在从HTTP响应匹配模式时开始执行某些操作?

伪代码:

http.get 'http://example.org/foo.json' do |response|
  run_this_function if /\"field\":\"data\"/ =~ response.body_str
end

我想要类似于odoe.js的东西,但是在Ruby中。

1 个答案:

答案 0 :(得分:2)

通常,Net :: HTTP会将整个主体拉入内存,但您可以将该行为更改为流式传输。来自the documentation

  

流式响应机构↑

     

默认情况下,Net :: HTTP会将整个响应读入内存。如果您正在处理大型文件或希望实现进度条,则可以将主体直接流式传输到IO。

uri = URI('http://example.com/large_file')

Net::HTTP.start(uri.host, uri.port) do |http|
  request = Net::HTTP::Get.new uri

  http.request request do |response|
    open 'large_file', 'w' do |io|
      response.read_body do |chunk|
        io.write chunk
      end
    end
  end
end

您希望代码在read_body块中驻留。请参阅read_body的文档,因为您应该了解其他信息,但基本上它会说:

  

如果给出了一个块,则将主体传递给该块,并且当从插槽中读入时,正文将以片段形式提供。