读取红宝石后变量的内容更改

mgu*_*gul 1 ruby sinatra

我是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对象,但是我仍然无法进一步研究。

aku*_*uhn 5

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)