在调用操作之前检查 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...
}
}
我正在 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...
}
}