lms*_*lms 31 ruby rack sinatra
我正在编写一个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
Run Code Online (Sandbox Code Playgroud)
有什么方法可以抽象出来,这样我就不需要为每条路线做这件事了?我的一些路由比这更复杂,因此使用这种方法,request.body将被重新读取并重新分析每个路由,我想避免.
有没有办法让request_payload神奇地可用于路由?像这样:
post '/doSomething' do
#do something with request_payload, it's already parsed and available
body request_payload['someKey']
end
Run Code Online (Sandbox Code Playgroud)
mcf*_*gan 55
在处理程序之前使用sinatra:
before do
request.body.rewind
@request_payload = JSON.parse request.body.read
end
Run Code Online (Sandbox Code Playgroud)
这会将它暴露给当前的请求处理程序.如果您希望它暴露给所有处理程序,请将其放在超类中并在处理程序中扩展该类.
您也可以使用Rack Middleware来解析它.见https://github.com/rack/rack-contrib只是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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33654 次 |
| 最近记录: |