在Rails中执行特定路由的机架中间件

时间:2015-12-04 19:34:25

标签: ruby-on-rails rack

我正在集成第三方API,并且只需将JSON数据发布到我们的服务器中。

内容类型为application/json,但有效负载实际上是gzip压缩的。由于内容类型,rails在尝试解析数据时抛出了ActionDispatch :: ParamsParser :: ParseError异常。

我计划编写一个机架中间件来捕获异常并尝试解压缩有效负载,但我只想为该特定操作执行此操作,是否有办法仅针对特定路由执行中间件?

更新

我已经考虑过匹配路径的模式,但理想情况下我喜欢在将来路径发生变化的情况下更加强大的东西。

更新

有关压缩的问题最好通过下面的亚特的评论来解决,并且路由会在另一个问题中得到解答,现在这个问题已被标记为副本。

1 个答案:

答案 0 :(得分:3)

您可以轻松地在路径上执行正则表达式匹配,并且仅在路径匹配时执行解压缩代码。在这种情况下,您没有为所有其他路由跳过中间件,但处理检查应该非常轻量级。将其放在 lib / middleware / custom_middleware.rb

class CustomMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    @req = Rack::Request.new(env)

    if should_use_this?
      # Your custom code goes here.
    end
  end


  def should_use_this?
    @req.path =~ /^matchable_path/ # Replace "matchable_path" with the path in question.
  end

end

然后将以下内容放入 config / environments / production.rb

config.middleware.use "CustomMiddleware"