看起来Ruby的Net :: HTTP的方法在阅读网页主体方面都是全有或全无.我怎么能读到身体的前100个字节呢?
我试图从内容服务器读取,如果请求的文件不可用,则在响应正文中返回一条简短的错误消息.我需要阅读足够的正文来确定文件是否存在.这些文件很庞大,所以我不想让整个机构检查文件是否可用.
这是一个旧线程,但根据我的研究,如何在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
您是否应该只使用HTTP HEAD
请求(Ruby Net::HTTP::Head
方法)来查看资源是否存在,并且只有在获得2xx或3xx响应时才会继续?这假设您的服务器配置为在文档不可用时返回4xx错误代码.我认为这是正确的解决方案.
另一种方法是请求HTTP头并查看结果中的content-length
标头值:如果您的服务器配置正确,您应该能够轻松地分辨短消息和长文档之间的长度差异.另一种选择:content-range
在请求中设置头字段(再次假设服务器正常运行WRT HTTP规范).
我不认为在你发送GET请求之后在客户端解决问题是要走的路:到那时,网络已经完成了繁重的工作,你不会真正节省任何浪费的资源.
参考:http标头定义