使用修改过的标头在Ruby中发出HTTP GET请求的最佳方法是什么?
我希望从日志文件的末尾获取一系列字节,并且已经使用以下代码进行操作,但是服务器正在返回一个响应,说“这是服务器无法理解的请求”(服务器是Apache)。
require 'net/http'
require 'uri'
#with @address, @port, @path all defined elsewhere
httpcall = Net::HTTP.new(@address, @port)
headers = {
'Range' => 'bytes=1000-'
}
resp, data = httpcall.get2(@path, headers)
http://[address]:[port]/[path]
,我会毫无问题地获取我正在寻找的数据。答案 0 :(得分:25)
创建了一个适合我的解决方案(工作得非常好) - 这个示例获得范围偏移:
require 'uri'
require 'net/http'
size = 1000 #the last offset (for the range header)
uri = URI("http://localhost:80/index.html")
http = Net::HTTP.new(uri.host, uri.port)
headers = {
'Range' => "bytes=#{size}-"
}
path = uri.path.empty? ? "/" : uri.path
#test to ensure that the request will be valid - first get the head
code = http.head(path, headers).code.to_i
if (code >= 200 && code < 300) then
#the data is available...
http.get(uri.path, headers) do |chunk|
#provided the data is good, print it...
print chunk unless chunk =~ />416.+Range/
end
end
答案 1 :(得分:6)
如果您有权访问服务器日志,请尝试将来自浏览器的请求与Ruby中的请求进行比较,看看是否能告诉您任何内容。如果这不实用,请启动Webrick作为文件服务器的模拟。不要担心结果,只需比较请求,看看他们做的不同。
对于Ruby样式,您可以内联移动标题,如下所示:
httpcall = Net::HTTP.new(@address, @port)
resp, data = httpcall.get2(@path, 'Range' => 'bytes=1000-')
另请注意,在Ruby 1.8+中,您几乎肯定会运行,Net::HTTP#get2
会返回单个HTTPResponse
对象,而不是resp, data
对。