30

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
4

3 に答える 3

29

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を処理するオプションがあるかどうか、またはコンテンツタイプハンドラー宣言などを要求するオプションがあるかどうかを検討することができます-この種の処理するオプションがある可能性がありますフレームワーク内のリクエスト。

于 2013-03-17T08:21:28.740 に答える
14

試す:

env['rack.input'].read

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

于 2013-03-17T08:19:57.743 に答える
2

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

req.params

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

于 2017-07-14T07:56:45.353 に答える