Sinatra请求[“SOME_HEADER”]不适用于POST; doc bug?

时间:2012-06-29 14:33:10

标签: ruby sinatra rack

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的联合。并POST just returns the form hash。对于GET,它是查询哈希。在所有三条路线中,request.params都是空的。

我的问题:这是一个doc bug,还是我误解了如何使用request[]?目前,我的应用程序使用env[]方法正常工作。但我想“做对了。”

3 个答案:

答案 0 :(得分:11)

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

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

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

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

答案 1 :(得分:6)

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

我可以使用

访问它
env['HTTP_SOME_HEADER']

所以Sinatra(也许Rack)似乎添加了 HTTP _ 前缀(和大写)...... 奇怪。

答案 2 :(得分:0)

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

env['HTTP_SOME_HEADER']

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