2017-07-11 14 views
0

私は入力として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 

これは、しかし、デフォルトの応答の形式を変更し、変更されません。デフォルトの要求書式。 私がする必要があるのは、パラメータを解析するためのデフォルトの要求フォーマットを変更することです。ここで

答えて

0

Micael Nussbaumerの答えで提案由来私の正直ひどいソリューションです。いくつかのRubyistsがこの醜いハックを魔法のように1つのライナーに変えることができたら、私はそれを愛しています。

module Api 
    class BaseApiController < ActionController::API 

    private 
    # This is an ugly hack needed to make it default to json if you do not 
    # specify a Content-Type. If you see this and know of a better way please 
    # say so! 
    def params 
     if [email protected] 
     if request.headers["Content-Type"]=="application/x-www-form-urlencoded" 
      body_string = request.body.read 
      begin 
      hash = JSON.parse(body_string) 
      @params = ActionController::Parameters.new(hash) 
      rescue 
      # do nothing 
      end 
     end 
     if [email protected] 
      @params = super 
     end 
     end 
     @params 
    end 

    ... 

end 
2
parsed = JSON.parse(json_body) unless request.headers["Content-Type"] == 'application/json' 
+0

このコードは、標準的な使用に必要なActionController :: Parametersインスタンスではなく、ハッシュを生成します。次のような変種を使って私が望むものを得ることができますが、Railsからデフォルトの 'params'を変更することができないので、すべてのコントローラメソッドに貼り付ける必要があります。 request.headers ["Content-Type"] == "application/x-www-form-urlencoded" '** params = ActionController :: Parameters.new(JSON.parse(request.body.read)) ** – davidgyoung

+0

paramsの解析に先立って、ミドルウェアをラックに挿入し、ヘッダが間違っていれば正しく解析するかもしれませんか?おそらく、これはhttps://content.pivotal.io/blog/sanitizing-post-params-with-custom-rack-middleware(おそらくもっと簡単な方法がありますが、確かではありませんが、これは簡単です) –

+0

Rails 5では、ラックミドルウェアはもはやパラメータの解析には使用されないため、重要なブログソリューションはもはや機能しません。 https://github.com/rails/rails/commit/a1ced8b52ce60d0634e65aa36cb89f015f9f543d – davidgyoung

関連する問題