我是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
Run Code Online (Sandbox Code Playgroud)
执行此代码时,出现错误,因为尝试使用解析空字符串body = JSON.parse(request.body.read)。实际上,我必须保存request.body.read另一个变量才能使用两次(或多次),因为它就像request.body在第一次使用后被“消耗掉”。
这让我想起了锈蚀的借口,但是在这里我没想到,也无法在Google上表达它来查找任何文档。谁能解释我发生了什么,为什么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
Run Code Online (Sandbox Code Playgroud)
我听说过IO对象,但是我仍然无法进一步研究。
request.body 是输入流。
流是计算中的基本数据结构,其中数据是按顺序提供的,必须按顺序使用。例如,通过Internet发送的数据是流。
流处理功能非常强大,因为它允许您处理大于计算机内存的数据,例如Netflix上的电影将流式传输到您的计算机,因此它们不必存储整个电影,而只需存储当前帧。
通常,流只能读取一次。如果要多次访问流数据,则必须对其进行缓冲。您正在做什么body = request.body.read,做得好!
一些流是可倒带的。发生这种情况时request.body,Sinatra中的可以倒带,因此您可以将其倒带到开始并重新阅读。
request.body.read
request.body.rewind
request.body.read # => returns the content again
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |