web-dev-qa-db-ja.com

ラックリクエストのデータの読み方POST

Curlコマンドを実行すると

_curl -v -H "Content-type: application/json" -X POST -d '{"name":"abc", "id":"12", "subject":"my subject"}' http://localhost:9292
_

POSTリクエストとデータをRackアプリケーションに送信するために、私のコードは_{}_を出力します。これは以下のコードのputs req.POST()からのものです。

POSTデータの代わりに_{}_を出力するのはなぜですか?また、RackアプリケーションのPOSTデータに正しくアクセスするにはどうすればよいですか?

_require 'json'

class Greeter
  def call(env)
    req = Rack::Request.new(env)
    if req.post?
      puts req.POST()
    end
    [200, {"Content-Type" => "application/json"}, [{x:"Hello World!"}.to_json]]
  end
end

run Greeter.new
_
22
user782220

POSTのドキュメントを読むと、他のコンテンツタイプに基づいて解析されたデータが提供されているように見えます。 「application/json」を処理する場合は、おそらく次のことを行う必要があります。

JSON.parse( req.body.read )

代わりに。これを確認するには、

puts req.body.read

現在puts req.POSTがある場所。


req.bodyはI/Oオブジェクトであり、文字列ではありません。 body のドキュメントを参照し、ソースを表示してください。これは実際にはムダソブワの答えと同じであることがわかります。

Rackアプリケーションの他のコードは、SinatraやRailsのparamパーサーなど、同じI/Oを読み取ることを期待している場合があることに注意してください。同じデータが表示され、エラーが発生しないようにするには、コード内のリクエスト本文を読み取る前と後の両方で、req.body.rewindを呼び出すことをお勧めします。ただし、そのような状況にある場合は、代わりに、フレームワークにコントローラーのオプションを介して直接JSONを処理するオプションがあるかどうか、またはコンテンツタイプハンドラー宣言などを要求するオプションがあるかどうかを検討することができます-おそらくこの種の処理を行うオプションがありますフレームワーク内のリクエスト。

24
Neil Slater

試してください:

env['rack.input'].read

" RackでJSONオブジェクトを受け取る方法 "で見つけました。それでも私には奇妙に聞こえますが、おそらく機能します。

11

あなたが試すことができます:

req.params

これがお役に立てば幸いです。

3
Mr Zofy