私は入力としてJSONのみを受け付けるRails APIを持っています。 Content-Type:application/jsonのヘッダーを含めることができない場合、request.headers['Content-Type']
のデフォルトはapplication/x-www-form-urlencoded
になり、paramsは正しく解析されません。 jsonボディ全体がparamsのキーになります。結果は422であり、これはAPIユーザーにとって混乱を招く。デフォルトのContent-Typeを上書きする
Content-Typeヘッダーが指定されていない場合、これをデフォルトでjsonとして解析するにはどうすれば変更できますか?
レスポンス形式でこれを行う方法は他にもたくさんあります。以下のようなもので
request.format = :json
またはルート名前空間内:このデフォルトを変更するには、あなたがして、コントローラでそれを指定することができ
namespace :api, defaults: {format: :json} do
これは、しかし、デフォルトの応答の形式を変更し、変更されません。デフォルトの要求書式。 私がする必要があるのは、パラメータを解析するためのデフォルトの要求フォーマットを変更することです。ここで
このコードは、標準的な使用に必要なActionController :: Parametersインスタンスではなく、ハッシュを生成します。次のような変種を使って私が望むものを得ることができますが、Railsからデフォルトの 'params'を変更することができないので、すべてのコントローラメソッドに貼り付ける必要があります。 request.headers ["Content-Type"] == "application/x-www-form-urlencoded" '** params = ActionController :: Parameters.new(JSON.parse(request.body.read)) ** – davidgyoung
paramsの解析に先立って、ミドルウェアをラックに挿入し、ヘッダが間違っていれば正しく解析するかもしれませんか?おそらく、これはhttps://content.pivotal.io/blog/sanitizing-post-params-with-custom-rack-middleware(おそらくもっと簡単な方法がありますが、確かではありませんが、これは簡単です) –
Rails 5では、ラックミドルウェアはもはやパラメータの解析には使用されないため、重要なブログソリューションはもはや機能しません。 https://github.com/rails/rails/commit/a1ced8b52ce60d0634e65aa36cb89f015f9f543d – davidgyoung