在 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,因此你可以仅通过 ppp 即可看到 key-value 对。

但是,您可以在机架环境中看到请求 headers:

pp request.headers.env.select{|k, _| k =~ /^HTTP_/}

请记住,rack env 中的请求 headers 是原始 http 请求 upcased、underscored 和 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 将不再有效。