我是ruby的新手(昨天开始),我正在和sinatra一起构建一个API。我遇到了一个问题,让我毫无头绪:
post '/login' do
if request.body.read.length == 0
halt 400 # bad request
else
body = JSON.parse(request.body.read)
end
end
当我执行此代码时,我遇到了错误,因为我尝试使用body = JSON.parse(request.body.read)
解析空字符串。事实上,我必须将request.body.read
保存在另一个变量中以使用它两次(或更多),因为它就像request.body
在第一次使用后被“消耗”。
这让我想起了生锈的借口,但在这里我没想到,也无法在谷歌上发表任何文件。 任何人都可以向我解释发生了什么以及为什么request.body
只有一次可读?
对于有同样问题的人(我们永远不知道),这是修复:
post '/login' do
body = request.body.read
if body.length == 0
halt 400 # bad request
else
body_json = JSON.parse(body)
end
end
我听说过IO对象,但我仍然无法进一步研究。
答案 0 :(得分:4)
request.body
是输入流。
Streams是计算中的基本数据结构,其中数据按顺序提供,并且必须按顺序使用。例如,通过互联网发送的数据是流。
流处理非常强大,因为它允许您处理比机器内存更大的数据,例如Netflix上的电影流式传输到您的计算机,因此它们不必存储整个电影,只能存储当前帧。
通常,流只能读取一次。如果要多次访问流数据,则必须缓冲它。这就是你在body = request.body.read
做的事情,干得好!
某些流可以重绕。碰巧,Sinatra中的request.body
可以重绕,所以你可以将它倒回到开头并再次阅读。
request.body.read
request.body.rewind
request.body.read # => returns the content again