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

最初の仕様はパスします。次の 2 つは失敗します。

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

ソースを見ると、シナトラは実際には何もしていません[]GETとの和集合として Rack に実装されていPOSTます。そしてPOST 、フォーム hash を返すだけです。それGETはクエリハッシュです。3 つのルートすべてで、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 に答える
0

ええ、ジョルジオが言ったように、ヘッダーは大文字で、次のようにフォーマットされていました。

env['HTTP_SOME_HEADER']

ハイフンはアンダースコアに変換されます。これはかなり紛らわしいです。

于 2016-06-15T07:19:03.597 に答える