在Rails 4中显示或获取HTTP标头属性

del*_*pha 12 ruby ruby-on-rails rails-api

我有一个在Rails中开发的应用程序,我试图在HTTP标头中查看属性.

有没有办法阅读这些属性?它们存放在哪里?

有人提到过request.headers.它是否正确?我无法在此数组中看到任何属性.

Aet*_*rus 34

request.headers不返回哈希,而是返回一个实例ActionDispatch::Http::Headers,它是机架环境的包装器.

ActionDispatch::Http::Headers实现了许多方法[],[]=这些方法使得它的行为类似于哈希,但它不会覆盖默认值inspect,因此您无法通过它ppp它来查看键值对.

但是,您可以在机架环境中查看请求标头:

pp request.headers.env.select{|k, _| k =~ /^HTTP_/}
Run Code Online (Sandbox Code Playgroud)

请记住,机架env中的请求标头是原始http请求标头的upcased,underscored和HTTP_前缀版本.

UPDATE

实际上有一组有限的请求头没有前缀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
Run Code Online (Sandbox Code Playgroud)

所以列表请求标题的完整版本将是

pp request.headers.env.select{|k, _| k.in?(ActionDispatch::Http::Headers::CGI_VARIABLES) || k =~ /^HTTP_/}
Run Code Online (Sandbox Code Playgroud)

  • 我有点困惑,因为我一直得到所有以 `HTTP` 为前缀的属性,为什么我不能用类似 `response['Cache-Control']` 的东西访问它 (2认同)
  • @ user3433309您绝对可以访问请求标头,例如`request.headers ['Authorization']`.出于这个原因,Rails包装机架env.你可以看一下`ActionDispatch :: Http :: Headers`的源代码,它非常简单. (2认同)

del*_*pha 6

这段代码解决了我的问题request.env["HTTP_MY_HEADER"].诀窍是我必须在头文件的名称前加上HTTP


zac*_*san 5

我注意到在Rails 5中,他们现在希望标题在请求中的拼写如下:

Access-Token

在将它们转换为之前:

HTTP_ACCESS_TOKEN

在Rails中。这样做ACCESS_TOKEN将不再起作用。