我知道如何在Rails中访问标头
request.headers["HEADER_NAME"]
Run Code Online (Sandbox Code Playgroud)
但是,我希望获得浏览器传递的所有标头.我明白我可以列举它
request.headers.each { |header| ... }
Run Code Online (Sandbox Code Playgroud)
但是,这会吐出标头和其他环境变量.有没有办法只获得标题?
更新1
我的问题不是互动.我的问题是区分环境变量和标题.使用每个或按键进行交互时将报告它们.
Ole*_*yev 14
解
按照惯例,标题通常不包含点.默认情况下,Nginx甚至拒绝了标头中带点的请求.所以我认为这是一个非常安全的假设.
相反地,所有轨道环境垃圾命名空间例如action_dispatch.show_exceptions,rack.input等等.
这两个事实很方便地建议了一种区分外部头文件和内部变量的方法:
request.headers.env.reject { |key| key.to_s.include?('.') }
Run Code Online (Sandbox Code Playgroud)
工作很整洁.
基准测试
请注意,该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
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.
小智 10
通过使用
request.headers.each { |key, value| }
Run Code Online (Sandbox Code Playgroud)
这是使用(键+值)迭代您请求的标头,但如果您需要特定值,则必须使用密钥名称,如HTTP_KEYNAME,因为每当HTTP请求到来时,它都会将HTTP附加到密钥并确保大写,因为它区分大小写.
例如:
如果我们已经将auth_token作为头请求参数传递并想要访问,我们可以使用它.
request.headers["HTTP_AUTH_TOKEN"]
Run Code Online (Sandbox Code Playgroud)
您可以尝试此操作以仅从请求中获取标头列表
request.headers.first(50).to_h.keys
Run Code Online (Sandbox Code Playgroud)
它将request.headers对象转换为数组,然后进行哈希处理以获取请求中所有键的列表,以用作
request.headers["keyname"]
Run Code Online (Sandbox Code Playgroud)
它可能效率不高,但我认为它可以胜任。
希望这可以帮助。
不确定这是否有用,但我最终使用这种蛮力方法
request.env.select {|k,v|
k.match("^HTTP.*|^CONTENT.*|^REMOTE.*|^REQUEST.*|^AUTHORIZATION.*|^SCRIPT.*|^SERVER.*")
}
Run Code Online (Sandbox Code Playgroud)
Fre*_*ung -1
你应该能够做到
request.headers.each { |key, value| }
Run Code Online (Sandbox Code Playgroud)
一般来说,当迭代哈希值时,Ruby 会查看块的数量,并为您提供一对(键 + 值)或单独的变量。(本例中的哈希是 headers 对象内部的对象)