读取ruby

时间:2016-12-28 00:49:49

标签: 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

当我执行此代码时,我遇到了错误,因为我尝试使用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对象,但我仍然无法进一步研究。

1 个答案:

答案 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