如何在rails 5应用程序中接受gzip压缩请求?

时间:2016-10-25 16:39:18

标签: ruby-on-rails rack ruby-on-rails-5

过去我使用过this solution,但是自从Rails 5 deprecated ParamsParser中间件后,它就再也无法使用了。

4 个答案:

答案 0 :(得分:6)

只需添加:

# 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"}%

答案 1 :(得分:3)

如果您在Rack::Head

之前插入中间件,这应该可行
config.middleware.insert_before Rack::Head, "CompressedRequests"

这应该可以解决问题

您可以使用以下命令检查应用的中间件堆栈

rake middleware

答案 2 :(得分:3)

答案 3 :(得分:2)

routes.rb 文件中:

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

api_controller.rb

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

我使用Paw客户端在一个全新的Rails 5应用程序上测试了这个:

enter image description here