12

Sinatra README

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 只返回表单 hash。因为GET它是查询哈希。在所有三个路线中,request.params都是空的。

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

4

3 回答 3

11

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

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

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

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

于 2012-06-29T16:05:54.613 回答
7

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

我可以访问它

env['HTTP_SOME_HEADER']

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

于 2014-11-28T11:18:00.287 回答
0

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

env['HTTP_SOME_HEADER']

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

于 2016-06-15T07:19:03.597 回答