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

问题描述 投票:11回答:3

Sinatra README 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实际上并没有对[]做任何事情;它作为GETPOST的联合在Rack中实现。和POST just returns the form hash。对于GET,它是查询哈希。在所有三条路线中,request.params都是空的。

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

ruby sinatra rack
3个回答
11
投票

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

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

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

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


6
投票

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

我可以访问它

env['HTTP_SOME_HEADER']

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


0
投票

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

env['HTTP_SOME_HEADER']

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

© www.soinside.com 2019 - 2024. All rights reserved.