为什么打开(' uri')。读删除响应数据?

时间:2017-06-01 13:55:41

标签: ruby

如果我打开一个URI并按如下方式读取响应:

response = open("https://www.example.com")
result = response.read

工作正常,但如果我再次调用response.read,则返回一个空字符串。这似乎很奇怪。为什么会这样?

1 个答案:

答案 0 :(得分:3)

因为OpenURI正在返回一个Tempfile对象,这是File类的特殊实现:

  

Tempfile对象的行为与File对象类似,您可以对其执行所有常用的文件操作:读取数据,写入数据,更改其权限等。因此,尽管此类未明确记录所有支持的实例方法文件,您实际上可以在Tempfile对象上调用任何File实例方法。

File课程' parent是IO对象。这意味着当您致电read时,您正在呼叫IO implementation of the method

所有这一切意味着您在执行response.read时正在阅读文件,而您在阅读文件结束前一直在阅读。这就是为什么你在第二次阅读时得到一个空字符串的原因,因为你正试图从文件末尾读取,而该文件没有任何内容。

以下是查看此内容的一种方法:

require 'open-uri'
response = open('http://google.com')
puts response.class # => Tempfile

puts response.read  # => <!doctype html><html ...
puts response.pos   # => 10941

puts response.read  # => ""
response.rewind
puts response.pos   # => 0
puts response.read  # => <!doctype html><html ...