在调用操作之前检查 rails 中是否存在 header 属性

Check for the existing of a header attribute in rails before invoking an action

我正在 rails 中构建一个 API 4. 在调用操作之前,我首先尝试检查 http header 中是否存在属性。有没有办法做到这一点,而不是检查控制器的所有操作中的每一个。 rails 文档提到了类似

的内容
constraints(lambda { |req| req.env["HTTP_CUSTOM_HEADER"] =~ /value/ }) do
  #controller, action mapping
end

但我还是想给消费我的 API 的用户一个反馈。类似于发送 json 和消息说明:missing the custom attribute in the header

您可以将before_action添加到控制器并检查一个header属性,例如:

class SomeController < ApplicationController
  before_action :render_message, unless: :check_header

  def check_header
    request.env["HTTP_CUSTOM_HEADER"] =~ /foo/
  end

  def render_message
    render json: { message: "missing the custom attribute in the header" }
  end
end

如果 check_attribute 过滤器 returns nil,则 render_message 操作呈现所需的消息。

您可以使用 before_action 过滤器检查控制器操作:

例如 APIController:

class APIController < ApplicationController
  before_action :check_headers

  private

  def check_header
    # do whatever is required here
  end
end

如果 header 的存在作为一种身份验证机制,则没有必要为此访问后端,请尽量避免在 reverse-proxy 端更早地使用它:

nginx.conf

server {
  location / {
    if ($http_x_custom_header) {
      return 200 'missing the custom attribute in the header'; 
    }
    proxy_pass...
  }
}