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
_
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を処理するオプションがあるかどうか、またはコンテンツタイプハンドラー宣言などを要求するオプションがあるかどうかを検討することができます-おそらくこの種の処理を行うオプションがありますフレームワーク内のリクエスト。
あなたが試すことができます:
req.params
これがお役に立てば幸いです。