我知道如何在Rails中访问标题
request.headers["HEADER_NAME"]
但是,我希望获得浏览器传递的所有标头。我知道我可以枚举它
request.headers.each { |header| ... }
但是,这会吐出标头和其他环境变量。有没有办法只获得标题?
更新1
我的问题不是互动。我的问题是区分环境变量和标题。使用每个或按键进行交互时将报告它们。
答案 0 :(得分:10)
使用
request.headers.each { |key, value| }
这是使用(键+值)迭代您请求的标头,但是如果您需要特定值,则必须使用密钥名称,例如HTTP_KEYNAME,因为每当HTTP请求到来时,它都会将HTTP附加到密钥并确保大写,因为它是区分大小写。
例如:
如果我们已将 auth_token 作为标头请求参数传递并想要访问,我们可以使用此功能。
request.headers["HTTP_AUTH_TOKEN"]
答案 1 :(得分:10)
解决方案
按照惯例,标头通常不包含点。默认情况下,Nginx甚至rejected请求的标头中都有点。因此,我认为这是一个很安全的假设。
相反,所有的rails环境垃圾都被命名为例如。 action_dispatch.show_exceptions
,rack.input
等
这两个事实很方便地提出了一种区分外部标头和内部变量的方法:
request.headers.env.reject { |key| key.to_s.include?('.') }
工作整洁。
基准化
请注意,include?('.')
实现比匹配=~ /\./
快4倍
Benchmark.measure { 500000.times { hsh.reject { |key| key.to_s =~ /\./ } } }
=> real=2.09
Benchmark.measure { 500000.times { hsh.reject { |key| key.to_s.include?('.') } } }
=> real=0.58
希望有帮助。
答案 2 :(得分:5)
您可以尝试此操作,仅从请求中获取标题列表
$add = '- 30 days';
echo date('Y-m-01', strtotime($add)); // result is 2017-02-01 which is correct as need
它会将request.headers对象转换为数组,然后进行哈希以获取请求中所有键的列表
$add = '-1 month';
echo date('Y-m-01', strtotime($add)); // result is 2017-03-01 which is in correct
效率可能不高,但我认为它可以做到这一点。
希望这有帮助。
答案 3 :(得分:5)
不确定这是否有用,但我最终使用了这种蛮力方法
request.env.select {|k,v|
k.match("^HTTP.*|^CONTENT.*|^REMOTE.*|^REQUEST.*|^AUTHORIZATION.*|^SCRIPT.*|^SERVER.*")
}
答案 4 :(得分:1)
您可能正在寻找:
request.env
这基本上会创建整个请求对象的Ruby Hash。
有关详细信息,请查看以下问题: How do I see the whole HTTP request in Rails
答案 5 :(得分:0)
如果只需要标题:
request.headers.to_h.select { |k,v|
['HTTP','CONTENT','AUTHORIZATION'].any? { |s| k.to_s.starts_with? s }
}
如果您想要的一切都不是env var:
request.headers.to_h.select { |k,v|
['HTTP','CONTENT','REMOTE','REQUEST','AUTHORIZATION','SCRIPT','SERVER'].any? { |s|
k.to_s.starts_with? s
}
}
答案 6 :(得分:-1)
你应该能够做到
request.headers.each { |key, value| }
通常,当遍历散列时,ruby会查看块的arity,并为您提供一对(键+值)或单独的变量。 (在这种情况下,散列是头对象内部的对象)