【问题标题】:Sinatra request["SOME_HEADER"] doesn't work on POST; doc bug?Sinatra 请求["SOME_HEADER"] 在 POST 上不起作用;文档错误?
【发布时间】:2012-07-01 02:23:46
【问题描述】:

Sinatra 自述文件says:

request["SOME_HEADER"]      # value of SOME_HEADER header

鉴于这个应用程序:

require 'sinatra'

post '/env' do
    env['HTTP_X_FOO']
end

post '/request' do 
    request['X-Foo']
end

post '/request_rack_http_format' do
    request['HTTP_X_FOO']
end

第一个规范通过;接下来的两个失败:

describe "Sinatra should place the header in" do
    before(:all) do
        header 'X-Foo', 'Bar'
    end

    example "env" do
        post '/env'
        last_response.body.should == 'Bar' #pass
    end

    example "request[]" do
        post '/request'
        last_response.body.should == 'Bar' #fail; got ""
    end

    example "request[] (rack format)" do
        post '/request_rack_http_format'
        last_response.body.should == 'Bar' #fail; got ""
    end
end

查看源代码,Sinatra 实际上并没有对[] 做任何事情;它在 Rack 中实现为 GETPOST 的联合。还有POSTjust returns the form hash。对于GET,它是查询哈希。在所有三个路由中,request.params 都是空的。

我的问题:这是一个文档错误,还是我误解了如何使用request[]?目前,我的应用程序使用 env[] 方法运行良好。但我想做到“正确”。

【问题讨论】:

    标签: ruby sinatra rack


    【解决方案1】:

    似乎是文档中的一个错误。 request[] 实际上是检索请求的参数,而不是标头:

    https://github.com/rack/rack/blob/master/lib/rack/request.rb#L262

    def [](key)
      params[key.to_s]
    end
    

    我也通过测试仔细检查了它。看起来有点傻,但看起来你真的不能以任何方式直接访问标题除了通过env。至少我想不出任何其他方法。

    【讨论】:

    【解决方案2】:

    我意识到如果标题中的参数是“SOME_HEADER”

    我可以通过

    访问它
    env['HTTP_SOME_HEADER']
    

    所以 Sinatra(可能是 Rack)似乎添加了 HTTP_ 前缀(和大写)... 奇怪。

    【讨论】:

      【解决方案3】:

      是的,正如 Giorgio 所说,标题是大写的,格式如下:

      env['HTTP_SOME_HEADER']
      

      任何连字符都转换为下划线。这很令人困惑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-16
        • 2018-12-06
        • 1970-01-01
        相关资源
        最近更新 更多