当前位置:  开发笔记 > 后端 > 正文

如何使用Net :: HTTP只读取正文的x个字节?

如何解决《如何使用Net::HTTP只读取正文的x个字节?》经验,为你挑选了2个好方法。

看起来Ruby的Net :: HTTP的方法在阅读网页主体方面都是全有或全无.我怎么能读到身体的前100个字节呢?

我试图从内容服务器读取,如果请求的文件不可用,则在响应正文中返回一条简短的错误消息.我需要阅读足够的正文来确定文件是否存在.这些文件很庞大,所以我不想让整个机构检查文件是否可用.



1> Dustin Frazi..:

这是一个旧线程,但根据我的研究,如何在Ruby中仅通过HTTP读取文件的一部分的问题仍然是一个未解决的问题.这是我通过猴子修补Net :: HTTP得出的一个解决方案:

require 'net/http'

# provide access to the actual socket
class Net::HTTPResponse
  attr_reader :socket
end

uri = URI("http://www.example.com/path/to/file")
begin
  Net::HTTP.start(uri.host, uri.port) do |http|
    request = Net::HTTP::Get.new(uri.request_uri)
    # calling request with a block prevents body from being read
    http.request(request) do |response|
      # do whatever limited reading you want to do with the socket
      x = response.socket.read(100);
      # be sure to call finish before exiting the block
      http.finish
    end
  end
rescue IOError
  # ignore
end

救援捕获了过早调用HTTP.finish时抛出的IOError.

仅供参考,HTTPResponse对象中的套接字不是一个真正的IO对象(它是一个内部类BufferedIO),但是猴子修补也很容易模仿IO你需要的方法.例如,我正在使用的另一个库(exifr)需要这个readchar方法,这个方法很容易添加:

class Net::BufferedIO
  def readchar
    read(1)[0].ord
  end
end


请注意,响应可能会被压缩,然后在上面的示例中将获得100个"二进制"八位字节.在期待文本时,使用`request = Net :: HTTP :: Get.new(uri.request_uri,{'Accept-Encoding'=>'entity'})`来禁用压缩.请注意,如果响应被分块,[将首先获得一个包含块大小的行](http://en.wikipedia.org/wiki/Chunked_transfer_encoding#Format),以十六进制表示.因此,`response.socket.read(100)`将产生一个十六进制数为64的行,另一行产生100个八位字节(如果服务器发送较小的块,则产生较小尺寸的多行).

2> Ian Dickinso..:

您是否应该只使用HTTP HEAD请求(Ruby Net::HTTP::Head方法)来查看资源是否存在,并且只有在获得2xx或3xx响应时才会继续?这假设您的服务器配置为在文档不可用时返回4xx错误代码.我认为这是正确的解决方案.

另一种方法是请求HTTP头并查看结果中的content-length标头值:如果您的服务器配置正确,您应该能够轻松地分辨短消息和长文档之间的长度差异.另一种选择:content-range在请求中设置头字段(再次假设服务器正常运行WRT HTTP规范).

我不认为你发送GET请求之后在客户端解决问题是要走的路:到那时,网络已经完成了繁重的工作,你不会真正节省任何浪费的资源.

参考:http标头定义


嗯.如果您的供应商发送200 OK确实意味着404未找到,那么您应该提出优先级bugrep!
推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有