如何使用Net :: HTTP读取正文的x个字节?
在阅读网页正文时,Ruby的Net :: HTTP的方法似乎全部或者全部都不存在。我怎样才能读取,例如,正文的前100个字节?
我正在尝试从内容服务器读取内容,如果请求的文件不可用,则该内容服务器会在响应的正文中返回一条简短的错误消息。我需要阅读足够的正文以确定文件是否存在。文件很大,所以我不想只检查文件是否可用。
解决方案
回答
你不能但是为什么需要呢?当然,如果页面只是说该文件不可用,那么它就不会是一个很大的页面(即,根据定义,该文件将不会在那里)?
回答
我们确定内容服务器仅返回简短的错误页面吗?
难道不是也将HTTPResponse设置为类似404之类的情况。在这种情况下,我们可以捕获在访问Net :: HTTP.value()时引发的HTTPClientError派生异常(很可能是HTTPNotFound)。 。
如果出现错误,则文件不存在,如果我们收到200,则文件开始下载,我们可以关闭连接。
回答
要分块读取HTTP请求的正文,我们需要像这样使用Net :: HTTPResponse#read_body
:
http.request_get('/large_resource') do |response| response.read_body do |segment| print segment end end
回答
我们是否不应该仅使用HTTPHEAD
请求(RubyNet
:HTTP :: Head`方法)来查看资源是否存在,并且仅在收到2xx或者3xx响应的情况下继续进行操作?这假定服务器配置为在文档不可用时返回4xx错误代码。我认为这是正确的解决方案。
一种替代方法是请求HTTP头并查看结果中的content-length
头值:如果服务器配置正确,则应该能够轻松分辨出短消息和长文档之间的长度差异。另一种选择是:在请求中设置" content-range"标头字段(再次假设服务器通过HTTP规范正确运行WRT)。
我不认为在发送GET请求后解决客户端中的问题是要走的路:到那时,网络已经完成了繁重的工作,并且我们实际上不会节省任何浪费的资源。
参考:http标头定义
回答
我想做一次,唯一想到的就是猴子修补Net :: HTTP#read_body和Net:HTTP#read_body_0方法以接受长度参数,然后在前一种方法中将length参数传递给read_body_0
方法,在该方法中,我们最多只能读取length个字节。