在Rails请求中仅打印出标题

Vic*_*nin 31 ruby-on-rails

我知道如何在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)


May*_*ank 6

您可以尝试此操作以仅从请求中获取标头列表

request.headers.first(50).to_h.keys
Run Code Online (Sandbox Code Playgroud)

它将request.headers对象转换为数组,然后进行哈希处理以获取请求中所有键的列表,以用作

request.headers["keyname"]
Run Code Online (Sandbox Code Playgroud)

它可能效率不高,但我认为它可以胜任。

希望这可以帮助。


Car*_*que 6

不确定这是否有用,但我最终使用这种蛮力方法

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 对象内部的对象)