gpt4 book ai didi

Ruby 分块编码客户端

转载 作者:可可西里 更新时间:2023-11-01 16:38:59 25 4
gpt4 key购买 nike

我正在尝试制作一个小的 ruby​​ 脚本,它使用 HTTP 分块传输编码接收流数据。所以我在 client 端使用了 ruby​​。我可以找到很多关于 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 脚本(服务器)可能有问题,但我可以看到它很好地将它的 block 放入 firefox。

那么有没有一种简单的 ruby​​ 方法来流入数据?或者我应该期望需要特殊的 gem /图书馆来做到这一点? (例如,我遇到了 this library)

最佳答案

我认为下面的代码应该可以工作。

require 'net/http'

streamURL = 'http://localhost/sample-stream.php'

uri = URI.parse(streamURL)

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

http.request request do |response|
response.read_body do |chunk|
#We get the data here chunk-by-chunk
puts chunk
end
end
end

实际上这对我的 sample-stream.php 不起作用,但我幸运地得到了与此脚本类似的东西,指向另一台服务器。我的工作代码更复杂,因为它还需要身份验证,但我在这里将其精简了一些。

指向我的测试 php 脚本,此代码会生成一条有用的错误消息:

`read_chunked': wrong chunk size line: (Net::HTTPBadResponse)

...这清楚地表明我在 php 服务器端做错了什么。不确定出了什么问题,但这是另一个问题。

关于Ruby 分块编码客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9837421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com