【发布时间】:2015-09-04 19:19:17
【问题描述】:
我有一个在 Rails 中开发的应用程序,我正在尝试查看 HTTP 标头中的属性。
有没有办法读取这些属性?它们存储在哪里?
有人提到了request.headers。它是否正确?我无法看到此数组中的任何属性。
【问题讨论】:
标签: ruby-on-rails ruby rails-api
我有一个在 Rails 中开发的应用程序,我正在尝试查看 HTTP 标头中的属性。
有没有办法读取这些属性?它们存储在哪里?
有人提到了request.headers。它是否正确?我无法看到此数组中的任何属性。
【问题讨论】:
标签: ruby-on-rails ruby rails-api
request.headers 不返回哈希值,而是返回 ActionDispatch::Http::Headers 的实例,它是机架环境的包装器。
ActionDispatch::Http::Headers 实现了许多方法,例如 [] 和 []=,这使得它的行为类似于哈希,但它不会覆盖默认的 inspect,因此您无法通过仅查看键值对p 或 pp 它。
但是,您可以在 rack env 中查看请求标头:
pp request.headers.env.select{|k, _| k =~ /^HTTP_/}
请记住 rack env 中的请求标头是原始 http 请求标头的 upcased、underscored 和 HTTP_ 前缀版本。
实际上有一组有限的请求标头没有前缀HTTP_。这些(大写和带下划线的)标题名称存储在ActionDispatch::Http::Headers::CGI_VARIABLES 中。我在下面列出它们:
AUTH_TYPE
CONTENT_LENGTH
CONTENT_TYPE
GATEWAY_INTERFACE
HTTPS
PATH_INFO
PATH_TRANSLATED
QUERY_STRING
REMOTE_ADDR
REMOTE_HOST
REMOTE_IDENT
REMOTE_USER
REQUEST_METHOD
SCRIPT_NAME
SERVER_NAME
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
所以列出请求标头的完整版本是
pp request.headers.env.select{|k, _| k.in?(ActionDispatch::Http::Headers::CGI_VARIABLES) || k =~ /^HTTP_/}
【讨论】:
HTTP 为前缀的属性,为什么我不能用response['Cache-Control'] 之类的东西访问它
request.headers['Authorization'] 这样的请求标头。正是出于这个原因,Rails 封装了 rack env。大家可以看一下ActionDispatch::Http::Headers的源码,很简单。
request.headers.env['HTTP_X_PROVIDER_SIGNATURE'] 或request.headers['X-Provider-Signature'] 访问一个属性,在我的例子中是一个OAuth2 签名。一个 Rails5 应用程序。
这段代码解决了我的问题request.env["HTTP_MY_HEADER"]。诀窍是我必须在标题名称前加上HTTP
【讨论】:
request.headers['HTTP_MY_HEADER'] 也可以。
我注意到在 Rails 5 中,他们现在希望请求中的标头可以这样拼写:
Access-Token
在他们被转化为之前:
HTTP_ACCESS_TOKEN
在 Rails 中。执行ACCESS_TOKEN 将不再有效。
【讨论】:
您可以在控制器中使用 @_headers 查看实际 http 标头的哈希值。
【讨论】: