【问题标题】:Print out only headers in Rails request仅打印 Rails 请求中的标头
【发布时间】:2015-02-26 06:21:10
【问题描述】:

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

request.headers["HEADER_NAME"]

但是,我想获取浏览器传递的所有标头。我看到我可以枚举它

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

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

更新 1

我的问题不是交互。我的问题是区分环境变量和标头。在使用每个 或 键进行交互时,它们都会被报告。

【问题讨论】:

  • 当前的答案列表似乎都误解了这个问题。我也遇到过类似的需求,但还不知道如何解决它。。
  • 在 express.js 中,您将整个请求作为一个对象。 Ruby on rails 中有类似的吗?
  • @songyy 我似乎找到了解决方案 - 如果仍然需要,请查看我的答案

标签: ruby-on-rails


【解决方案1】:

解决方案

按照惯例,标题通常不包含点。默认情况下,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】:

    通过使用

    request.headers.each { |key, value|  }
    

    这是用 (key+value) 迭代您请求的标头,但是如果您想要特定的值,您必须使用诸如 HTTP_KEYNAME 之类的键名,因为每当 HTTP 请求到来时,它都会将 HTTP 附加到键并确保大写,因为它是区分大小写。

    例如:

    如果我们已经将auth_token作为header请求参数传入并且想要访问,我们可以使用这个。

    request.headers["HTTP_AUTH_TOKEN"]
    

    【讨论】:

      【解决方案3】:

      你可以试试这个从请求中只获取标题列表

      request.headers.first(50).to_h.keys
      

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

      request.headers["keyname"]
      

      它可能效率不高,但我认为它可以完成这项工作。

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

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

        request.env.select {|k,v|
          k.match("^HTTP.*|^CONTENT.*|^REMOTE.*|^REQUEST.*|^AUTHORIZATION.*|^SCRIPT.*|^SERVER.*")
        }
        

        【讨论】:

          【解决方案5】:

          您可能正在寻找:

          request.env 
          

          这基本上会创建整个请求对象的 Ruby 哈希。

          有关更多详细信息,请查看以下问题: How do I see the whole HTTP request in Rails

          【讨论】:

          • 输出太长而无法扫描。需要一种更有选择性的方法。
          【解决方案6】:

          如果你只想要标题:

          request.headers.to_h.select { |k,v|
            ['HTTP','CONTENT','AUTHORIZATION'].any? { |s| k.to_s.starts_with? s }
          }
          

          如果你想要所有不是环境变量的东西:

          request.headers.to_h.select { |k,v|
            ['HTTP','CONTENT','REMOTE','REQUEST','AUTHORIZATION','SCRIPT','SERVER'].any? { |s|
              k.to_s.starts_with? s
            }
          }
          

          【讨论】:

            【解决方案7】:

            你应该可以的

            request.headers.each { |key, value|  }
            

            一般来说,当迭代哈希时,ruby 会查看块的数量,并为您提供一对(键 + 值)或单独的变量。 (本例中的哈希是 headers 对象的内部对象)

            【讨论】:

            • 我的问题不是交互。我的问题是区分环境变量和标题。在使用每个 或 键进行交互时,它们都会被报告。
            • request.headers 不响应键方法。它是 ActionDispatch::Http::Headers 的一个实例
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-04-01
            • 2013-03-19
            • 2019-01-19
            • 2019-01-30
            • 2016-11-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多