私は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
ハンドラーの前にシナトラを使用します。
before do
request.body.rewind
@request_payload = JSON.parse request.body.read
end
これにより、現在のリクエストハンドラに公開されます。すべてのハンドラーに公開する場合は、スーパークラスに入れて、ハンドラーでそのクラスを拡張します。
ラックミドルウェアを使用して解析することもできます。 https://github.com/rack/rack-contrib Just 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
before do
request.body.rewind
@request_payload = JSON.parse(request.body.read, symbolize_names: true)
end
したがって、JSONリクエスト本文の解析中にsymbolize_namesを使用することもできます。これにより、この@request_payload[:user]