次の問題があります。 WebサービスがJSON POSTリクエストをアプリに送信しており、解析したい。
私はパラメータにアクセスできると思った
@var = params[:name_of_the_JSON_fields]
しかし、それは機能しません。 Herokuのログを見ると、リクエストは完了しており、パラメーターはそこにあることがわかりますが、それらを保存することはできません。
誰かがアイデアを持っていますか?
JSON(またはXML)を投稿すると、Railsがすべての解析を処理しますが、正しいヘッダーを含める必要があります。
アプリに次のものを含めます。
Content-type: application/json
そして、すべてがクールになります。
この回答は、この正確な質問に特定のものではない場合がありますが、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()
ParamsハッシュでJSONを受け取っている場合は、自分で変換できます。
@var = JSON.parse(params[:name_of_the_JSON_fields])
おそらくあなたを助けるには遅すぎますが、おそらく将来の人々はここをチェックするでしょう:)おそらくRailsはあなたのためにjsonを解析するはずですが、それは私にとってはうまくいきません。私はリクエストボディを直接読みます。私は「Yajl」jsonパーサーを使用-非常に高速ですが、通常の古い「json」もここで機能します(JSON.parseを使用するだけです)
request.body.rewind
body = Yajl::Parser.parse request.body.read.html_safe
症状が記述されているほとんどの場合、問題の真の根本は着信リクエストのソースです。アプリにJSONを送信している場合、application/json
のContent-Typeヘッダーを送信しているはずです。
リクエストを送信するアプリを変更できる場合は、そのヘッダーを調整します。Railsは本文をJSONとして解析し、すべてが正常に機能し、解析されたJSONフィールドがparams
ハッシュ。
それが不可能な場合(たとえば、Amazon SNS通知を受信する場合など、リクエストのソースを制御しない場合)、RailsはボディをJSONとして自動的に解析しません)あなたのために、あなたができる最善のことは次のように自分で読んで解析することです:
json_params = JSON.parse(request.raw_post)