web-dev-qa-db-ja.com

Railsでの着信POSTリクエストのjsonを解析する方法は?

次の問題があります。 WebサービスがJSON POSTリクエストをアプリに送信しており、解析したい。

私はパラメータにアクセスできると思った

@var = params[:name_of_the_JSON_fields]

しかし、それは機能しません。 Herokuのログを見ると、リクエストは完了しており、パラメーターはそこにあることがわかりますが、それらを保存することはできません。

誰かがアイデアを持っていますか?

21
thomas8877

JSON(またはXML)を投稿すると、Railsがすべての解析を処理しますが、正しいヘッダーを含める必要があります。

アプリに次のものを含めます。

Content-type: application/json

そして、すべてがクールになります。

27
Jesse Wolgamott

この回答は、この正確な質問に特定のものではない場合がありますが、AWS SNSプッシュ通知を設定するときに同様の問題がありました。最初のサブスクリプション要求を解析または表示できませんでした。うまくいけば、これは同様の問題を持つ他の誰かを助けるでしょう。

以下のように、デフォルトのフォーマットがjsonに設定された単純なAPIセットアップがある場合は、解析する必要がないことがわかりました(config/routes.rb内):

 namespace :api, defaults: {format: :json}  do
    namespace :v1 do
      post "/controller_name" => 'controller_name#create'
      get "/controller_name" => 'controller_name#index'
    end
  end

私が発見した重要なことは、着信ポスト要求が変数requestによってアクセスできることです。これを読み取り可能なJSON形式に変換するには、次を呼び出すことができます。

request.body.read()
12
Matte3o

ParamsハッシュでJSONを受け取っている場合は、自分で変換できます。

@var = JSON.parse(params[:name_of_the_JSON_fields])
10
zetetic

おそらくあなたを助けるには遅すぎますが、おそらく将来の人々はここをチェックするでしょう:)おそらくRailsはあなたのためにjsonを解析するはずですが、それは私にとってはうまくいきません。私はリクエストボディを直接読みます。私は「Yajl」jsonパーサーを使用-非常に高速ですが、通常の古い「json」もここで機能します(JSON.parseを使用するだけです)

request.body.rewind
body = Yajl::Parser.parse request.body.read.html_safe
4
Kevin

症状が記述されているほとんどの場合、問題の真の根本は着信リクエストのソースです。アプリにJSONを送信している場合、application/jsonのContent-Typeヘッダーを送信しているはずです。

リクエストを送信するアプリを変更できる場合は、そのヘッダーを調整します。Railsは本文をJSONとして解析し、すべてが正常に機能し、解析されたJSONフィールドがparamsハッシュ。

それが不可能な場合(たとえば、Amazon SNS通知を受信する場合など、リクエストのソースを制御しない場合)、RailsはボディをJSONとして自動的に解析しません)あなたのために、あなたができる最善のことは次のように自分で読んで解析することです:

json_params = JSON.parse(request.raw_post)
4
mltsy