在Rails请求中仅打印出标题

时间:2015-02-26 06:21:10

标签: ruby-on-rails

我知道如何在Rails中访问标题

request.headers["HEADER_NAME"]

但是,我希望获得浏览器传递的所有标头。我知道我可以枚举它

request.headers.each { |header| ... }

但是,这会吐出标头和其他环境变量。有没有办法只获得标题?

更新1

我的问题不是互动。我的问题是区分环境变量和标题。使用每个或按键进行交互时将报告它们。

7 个答案:

答案 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_exceptionsrack.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,并为您提供一对(键+值)或单独的变量。 (在这种情况下,散列是头对象内部的对象)