web-dev-qa-db-ja.com

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
31
lms

ハンドラーの前にシナトラを使用します。

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

これにより、現在のリクエストハンドラに公開されます。すべてのハンドラーに公開する場合は、スーパークラスに入れて、ハンドラーでそのクラスを拡張します。

55
mcfinnigan

ラックミドルウェアを使用して解析することもできます。 https://github.com/rack/rack-contrib Just use Rack::PostBodyContentTypeParser Sinatraクラスを初期化するとき。

7
Harper Maddox

このようにシナトラ1.4.5で動作します

before do
  if request.body.size > 0
    request.body.rewind
    @params = ActiveSupport::JSON.decode(request.body.read)
  end
end
5
before do
  request.body.rewind
  @request_payload = JSON.parse(request.body.read, symbolize_names: true)
end

したがって、JSONリクエスト本文の解析中にsymbolize_namesを使用することもできます。これにより、この@request_payload[:user]

0
Serj Petrenko