在Rails中为特定路由执行Rack中间件

4
我正在集成第三方API,其中在一个步骤中,他们将JSON数据发布到我们的服务器上。
内容类型为application/json,但有效负载实际上是经过gzip压缩的。由于内容类型,当尝试解析数据时,rails会抛出ActionDispatch :: ParamsParser :: ParseError异常。
我计划编写一个Rack中间件来捕获异常并尝试解压缩有效负载,但我只想针对该特定操作执行此操作,有没有一种方法只针对特定路由执行中间件?
更新
我已经考虑了匹配路径的模式,但理想情况下,我希望有一些更健壮的东西,以防路径在将来发生变化。
更新
关于压缩的问题可以参考matt的评论,而路由问题则可以参考另一个被标记为重复的问题。

1
检查请求的"Content-encoding"头部,然后根据它处理压缩可能会更好,这不是吗?(假设第三方包含该标头,如果他们没有,请去打(比喻性的)巴掌) - matt
可能经过进一步调查,这似乎是一个不错的方法,并且他们正在发送 content-encoding 标头。 - agbodike
@matt 我找到了这个链接:https://gist.github.com/relistan/2109707 可以按照你的建议使用。 - agbodike
1个回答

9

您可以轻松地在路径上进行正则表达式匹配,并且只有在路径匹配时才执行解压缩代码。在这种情况下,您不会跳过所有其他路由的中间件,但处理检查应该非常轻量级。将此放置在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"

2
这是我已经考虑过的一种可能性,但我想要的东西比路径上简单的模式匹配更加健壮。 - agbodike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接