2013-07-01 8 views
19

私は、Rackミドルウェアフィルタが、initializeメソッドとcallメソッドを持つRubyクラスであることを知っています。私はコールメソッドが "env"引数を取ることを知っています。このようなもの:Rackミドルウェアの "env"変数とは何ですか?

class MyFilter 
    def initialize(app) 
    end 

    def call(env) 
    end 
end 

私の質問は「env」引数が「call」に送信された正確な内容です。これはRails ENV環境(すなわち、開発、テスト、制作)と同じですか?

ありがとうございます!

答えて

32

envはちょうどハッシュです。ラックそれ自体と様々なミドルウェアは、価値をそれに加えます。

さまざまなキーがハッシュに含まれていることを理解するには、Rack Specificationをチェックしてください。

{ 
    "GATEWAY_INTERFACE" => "CGI/1.1", 
    "PATH_INFO" => "/index.html", 
    "QUERY_STRING" => "", 
    "REMOTE_ADDR" => "::1", 
    "REMOTE_HOST" => "localhost", 
    "REQUEST_METHOD" => "GET", 
    "REQUEST_URI" => "http://localhost:3000/index.html", 
    "SCRIPT_NAME" => "", 
    "SERVER_NAME" => "localhost", 
    "SERVER_PORT" => "3000", 
    "SERVER_PROTOCOL" => "HTTP/1.1", 
    "SERVER_SOFTWARE" => "WEBrick/1.3.1 (Ruby/2.0.0/2013-11-22)", 
    "HTTP_HOST" => "localhost:3000", 
    "HTTP_USER_AGENT" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0", 
    "HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 
    "HTTP_ACCEPT_LANGUAGE" => "zh-tw,zh;q=0.8,en-us;q=0.5,en;q=0.3", 
    "HTTP_ACCEPT_ENCODING" => "gzip, deflate", 
    "HTTP_COOKIE" => "jsonrpc.session=3iqp3ydRwFyqjcfO0GT2bzUh.bacc2786c7a81df0d0e950bec8fa1a9b1ba0bb61", 
    "HTTP_CONNECTION" => "keep-alive", 
    "HTTP_CACHE_CONTROL" => "max-age=0", 
    "rack.version" => [1, 2], 
    "rack.input" => #<StringIO:0x007fa1bce039f8>, 
    "rack.errors" => #<IO:<STDERR>>, 
    "rack.multithread" => true, 
    "rack.multiprocess" => false, 
    "rack.run_once" => false, 
    "rack.url_scheme" => "http", 
    "HTTP_VERSION" => "HTTP/1.1", 
    "REQUEST_PATH" => "/index.html" 
} 

そして、それは簡単に使用できるようにする、それが簡単にENVハッシュ内の値にアクセスできるようになり、チェックアウトRack::Request:ここ

とは、サンプルのenvハッシュです。

8

単純なプログラミングを書いて 'env'変数を印刷しようとすることをお勧めします。

require "rubygems" 
require "rack" 
def pp(hash) 
    hash.map {|key,value| "#{key} => #{value}"}.sort.join("<br/>") 
end 
Rack::Handler::WEBrick.run lambda {|env| [200,{},[pp(env)]]} , :Port=>3000 

は、リンクローカルホストを入力してください:3000

+0

素晴らしい、ありがとう! – User314159

+0

exemplesによる学習よりも良いことはありません、ありがとう! –

5

env変数は、上流で追加された可能性がリクエストヘッダとボディを含む多くの有用な情報が含まれているハッシュ、および実行時環境データでありますミドルウェア。

+0

応答ありがとう! – User314159

0

あなたが持っているWebサーバーによって、source codeを見ると、envハッシュで異なる値を取得できます。 documentationにあるものを使用して、のみをお勧めします。

基本的にenvは、Webサーバーに固有の要求オブジェクトのハッシュバージョンです。 Rackは標準化されたenvを提供するためにいくつかの作業を行い、ミドルウェアはWebサーバー間で一貫して動作します。

関連する問題