如何在Sinatra中解析一次JSON请求体并将其暴露给所有路由?

我正在编写一个API,它接收一个JSON有效负载作为请求主体。

为了获得它,我正在做这样的事情:

post '/doSomething' do request.body.rewind request_payload = JSON.parse request.body.read #do something with request_payload body request_payload['someKey'] end 

有什么方法可以抽象出来,这样我就不需要为每条路线做这件事了? 我的一些路由比这更复杂,因此request.body将通过这种方法重新读取和重新分析每个路由,我想避免。

有没有办法让request_payload神奇地可用于路由? 像这样:

 post '/doSomething' do #do something with request_payload, it's already parsed and available body request_payload['someKey'] end 

在处理程序之前使用sinatra:

 before do request.body.rewind @request_payload = JSON.parse request.body.read end 

这会将它暴露给当前的请求处理程序。 如果您希望它暴露给所有处理程序,请将其放在超类中并在处理程序中扩展该类。

您也可以使用Rack Middleware来解析它。 请参阅https://github.com/rack/rack-contrib在初始化Sinatra类时use Rack::PostBodyContentTypeParser

像这样为sinatra 1.4.5工作

 before do if request.body.size > 0 request.body.rewind @params = ActiveSupport::JSON.decode(request.body.read) end end