我正在尝试制作一个小红宝石脚本,它使用 HTTP 块传输编码接收流数据。所以我在这个客户端使用红宝石。我可以找到很多关于 ruby(和 rails)服务流的问题和信息,但关于使用它们的信息不多。也许是因为它微不足道,应该只是作为 HTTP 的低级功能。那么有人可以给我一个小示例脚本吗?
我尝试了几件事。这个使用open-uri:
require 'open-uri'
streamURL = 'http://localhost/sample-stream.php'
puts "Opening"
open(streamURL) do |f|
puts "Opening steam " + streamURL + " (never gets here)"
p f.meta
p "Content-Type: " + f.content_type
p "last modified" + f.last_modified.to_s
no = 1
# print the first three lines
f.each do |line|
print "#{no}: #{line}"
no += 1
break if no > 4
end
end
...而这个使用 net http :
require 'net/http'
require 'uri'
streamURL = 'http://localhost/sample-stream.php'
url = URI.parse(streamURL)
full_path = (url.query.empty?) ? url.path : "#{url.path}?#{url.query}"
the_request = Net::HTTP::Get.new(full_path, {'Transfer-Encoding' => 'chunked', 'content-type' => 'text/plain'})
#(Side question: Does it even make sense to specify 'chunked' in the request?)
puts "Opening stream " + streamURL
the_response = Net::HTTP.start(url.host, url.port) { |http|
http.request(the_request)
}
puts the_response.body #never gets here
在这两种情况下,它都不会输出任何东西,我可以在 apache 中看到我的 php 脚本正忙于喷出越来越多的数据。我认为很明显这里出了什么问题。在这两种情况下,我认为我的脚本在处理它之前都在等待获得整个响应(这永远不会发生)。
我应该提到我的 php 脚本(服务器)可能有问题,但我可以看到它很好地将其块吹入 Firefox。
那么有没有一种简单的 ruby 方法来流式传输数据?还是我应该期望需要特殊的宝石/库来做到这一点?(例如,我遇到了这个库)