在Rails 5上检索请求标头的正确方法是哪种?

时间:2018-12-07 12:05:31

标签: ruby-on-rails http-headers

从我的搜索中,我发现使用Rails检索(或曾经使用)一种以上的请求标头的方法。例如,如果请求具有X-AppEngine-Country标头,则可以使用以下命令来检索它:

request.headers["HTTP_X_APPENGINE_COUNTRY"]

request.headers["X_APPENGINE_COUNTRY"]

request.headers["X-AppEngine-Country"]

这对我来说有点混乱,我找不到正确的方法。是哪一个?

1 个答案:

答案 0 :(得分:1)

如果您看一下Rails请求标头的实现,您会发现标头名称首先被“清理”了,并将其传递给Rack::Request::Env对象– https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/http/headers.rb#L122

    # Converts an HTTP header name to an environment variable name if it is
    # not contained within the headers hash.
    def env_name(key)
      key = key.to_s
      if HTTP_HEADER.match?(key)
        key = key.upcase.tr("-", "_")
        key = "HTTP_" + key unless CGI_VARIABLES.include?(key)
      end
      key
    end

Rails会为您upcase标头名称,并将-转换为_并在需要时在HTTP_前面加上。

考虑到这一点:

request.headers["HTTP_X_APPENGINE_COUNTRY"] –我会避免这一点,因为Rails将在HTTP_之前。

request.headers["X_APPENGINE_COUNTRY"] –我认为使用此功能没有错。

request.headers["X-AppEngine-Country"] –这是我要选择的,因为标题名称是其原始格式。

干杯!