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中实现为GET
和POST
的联合。并POST
just returns the form hash。对于GET
,它是查询哈希。在所有三条路线中,request.params
都是空的。
我的问题:这是一个doc bug,还是我误解了如何使用request[]
?目前,我的应用程序使用env[]
方法正常工作。但我想“做对了。”
答案 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']
将任何连字符转换为下划线。这很令人困惑。