我知道Rack中間件過濾器是一個帶初始化和調用方法的Ruby類。我知道調用方法需要一個「env」參數。事情是這樣的:Rack中間件中的「env」變量是什麼?
class MyFilter
def initialize(app)
end
def call(env)
end
end
我的問題是:究竟是發給「呼」的「ENV」的說法?這是否與Rails ENV環境相同(即開發,測試和生產)。
謝謝!
我知道Rack中間件過濾器是一個帶初始化和調用方法的Ruby類。我知道調用方法需要一個「env」參數。事情是這樣的:Rack中間件中的「env」變量是什麼?
class MyFilter
def initialize(app)
end
def call(env)
end
end
我的問題是:究竟是發給「呼」的「ENV」的說法?這是否與Rails ENV環境相同(即開發,測試和生產)。
謝謝!
env
只是一個散列。機架本身和各種中間件爲其添加值。
要了解散列中各種密鑰的含義,請查看Rack Specification。
這裏是一個樣本ENV散列:
{
"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"
}
,並使其更容易使用,結賬Rack::Request這使得它更容易地訪問ENV哈希內的值。
我建議你可以試着用簡單的編程來打印'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
查看source code,具體取決於您擁有的Web服務器,您可以在env哈希中獲得不同的值。我建議只有使用什麼在documentation。
基本上,env是特定於Web服務器的請求對象的散列版本。 Rack做一些工作來給出規範化的env,這樣中間件可以在整個web服務器上保持一致。
真棒,謝謝! – User314159
有沒有比通過例證學習更好,謝謝! –