2016-10-25 7 views
8

以前はthis solutionを使用していましたが、Rails 5 deprecatedParamsParserミドルウェア以来、もう動作しません。rails 5アプリケーションでgzippedリクエストを受け入れる方法は?

+0

それは動作しないためにnDispatch :: Cookies'?それはそれの後のミドルウェアであり、それはまだ存在します。 –

+0

nginxを使用してソリューションを実装して、https://www.nginx.com/resources/admin-guide/compression-and-decompression/の圧縮解除を行うことができます。このようにして、railsはそれを処理してコンテンツを取得する必要はありません右。 –

+1

賞金に感謝します。私はそれがあなたに助けてうれしい! – itsnikolay

答えて

5

だけ追加:

# config/initializers/middlewares.rb 
require 'compressed_requests' 

Rails.application.configure do 
    config.middleware.insert_after Rack::Sendfile, CompressedRequests 
end 


# lib/compressed_requests.rb 
# Copy the file from the article 

あなたはでそれをテストすることができます。

# config/routes.rb 
post '/', to: 'welcome#create' 

# app/controllers/welcome_controller.rb 
class WelcomeController < ActionController::Base 
    def create 
    render json: params 
    end 
end 

し、要求を実行します。

curl --data-binary @<(echo "Uncompressed data" | gzip) \ 
    -H "CONTENT_ENCODING: gzip" \ 
    localhost:3000 

{"Uncompressed data\n":null,"controller":"welcome","action":"create"}% 
3

あなたがミドルウェア直前Rack::Head

config.middleware.insert_before Rack::Head, "CompressedRequests" 

これは、次のコマンドを使用して、アプリケーションのミドルウェア・スタックを確認することができますトリック

を行う必要がありますを挿入した場合、これは動作するはず

rake middleware 
+0

あなたの応答はほとんど@itsnikolayと同じですが、彼はもう少し説明とテストをしたので、あなたの代わりに彼を受け入れました。しかし、とにかく感謝:) –

+0

私はそれを最初に追加! hahaが問題を解決してくれば問題はありません:) –

2

あなたroutes.rbをファイルの場合:あなたのapi_controller.rbで

post 'my_endpoint', to: 'api#my_endpoint' 

class ApiController < ActionController::Base 
    def my_endpoint 
    render json: JSON.parse(ActiveSupport::Gzip.decompress(request.body.string)) 
    end 
end 

私は足のクライアントを使用して新しいRailsの5アプリでこれをテストしてみた:あなたはユニコーンの前にnginxのを持っている場合は、あなただけのデータを解凍するためにnginxのを伝えることができ

enter image description here

+0

は実際には良い解決策ではありません。なぜなら、それは特定のアクションごとであり、毎回手動で圧縮解除を行うからです。 –

+0

@DiegoPlentzこれを再利用したい場合は、重要なビット( 'JSON.parse(ActiveSupport :: Gzip.decompress(request.body.string))')を保持する 'decompressed_body'メソッドを持つことができます。 このメソッドは、APIベースコントローラまたはコントローラーの関心事に含まれているため、再利用してコードをDRYにすることができます。 – rebagliatte

関連する問題