在 Rails 4 中显示或获取 HTTP header 属性
Display or get the HTTP header attributes in Rails 4
我有一个在 Rails 中开发的应用程序,我正在尝试查看 HTTP header 中的属性。
有没有办法读取这些属性?它们存储在哪里?
有人提到 request.headers
。这样对吗?我看不到此数组中的任何属性。
request.headers
不是 return 散列,而是 ActionDispatch::Http::Headers
的一个实例,它是 rack 环境的包装器。
ActionDispatch::Http::Headers
实现了很多方法,比如 []
和 []=
,这使得它的行为像一个散列,但它不会覆盖默认的 inspect
,因此你可以仅通过 p
或 pp
即可看到 key-value 对。
但是,您可以在机架环境中看到请求 headers:
pp request.headers.env.select{|k, _| k =~ /^HTTP_/}
请记住,rack env 中的请求 headers 是原始 http 请求 upcase
d、underscore
d 和 HTTP_
前缀版本 headers.
更新
实际上有一组有限的请求 header 没有前缀 HTTP_
。这些(大写和下划线)header 名称存储在 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
所以列表请求的完整版本 headers 将是
pp request.headers.env.select{|k, _| k.in?(ActionDispatch::Http::Headers::CGI_VARIABLES) || k =~ /^HTTP_/}
这段代码解决了我的问题request.env["HTTP_MY_HEADER"]
。诀窍是我必须在 header 的名字前加上 HTTP
您可以在控制器中使用 @_headers
查看实际 http headers 的哈希值。
我注意到 Rails 5 他们现在希望 headers 在请求中这样拼写:
Access-Token
转化前:
HTTP_ACCESS_TOKEN
在Rails。执行 ACCESS_TOKEN
将不再有效。
我有一个在 Rails 中开发的应用程序,我正在尝试查看 HTTP header 中的属性。
有没有办法读取这些属性?它们存储在哪里?
有人提到 request.headers
。这样对吗?我看不到此数组中的任何属性。
request.headers
不是 return 散列,而是 ActionDispatch::Http::Headers
的一个实例,它是 rack 环境的包装器。
ActionDispatch::Http::Headers
实现了很多方法,比如 []
和 []=
,这使得它的行为像一个散列,但它不会覆盖默认的 inspect
,因此你可以仅通过 p
或 pp
即可看到 key-value 对。
但是,您可以在机架环境中看到请求 headers:
pp request.headers.env.select{|k, _| k =~ /^HTTP_/}
请记住,rack env 中的请求 headers 是原始 http 请求 upcase
d、underscore
d 和 HTTP_
前缀版本 headers.
更新
实际上有一组有限的请求 header 没有前缀 HTTP_
。这些(大写和下划线)header 名称存储在 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
所以列表请求的完整版本 headers 将是
pp request.headers.env.select{|k, _| k.in?(ActionDispatch::Http::Headers::CGI_VARIABLES) || k =~ /^HTTP_/}
这段代码解决了我的问题request.env["HTTP_MY_HEADER"]
。诀窍是我必须在 header 的名字前加上 HTTP
您可以在控制器中使用 @_headers
查看实际 http headers 的哈希值。
我注意到 Rails 5 他们现在希望 headers 在请求中这样拼写:
Access-Token
转化前:
HTTP_ACCESS_TOKEN
在Rails。执行 ACCESS_TOKEN
将不再有效。