使用機架
在上一篇文章中,您了解了機架是什么。現(xiàn)在,是時候開始使用機架并提供一些頁面了。
Hello World
首先,讓我們從“Hello world”應(yīng)用程序開始。無論給出何種類型的請求,此應(yīng)用程序都將返回狀態(tài)代碼200(HTTP為“OK”),字符串“Hello world”作為正文。
在檢查以下代碼之前,請再次考慮任何機架應(yīng)用程序必須滿足的要求。
Rack應(yīng)用程序是響應(yīng)調(diào)用方法的任何Ruby對象,采用單個哈希參數(shù)并返回包含響應(yīng)狀態(tài)代碼,HTTP響應(yīng)標題和響應(yīng)體作為字符串數(shù)組的數(shù)組。
類HelloWorld
def call(env)
返回[200,{},["Hello world!"]]
end
end
正如您所看到的,HelloWorld類型的對象將滿足所有這些要求。它以一種非常微小而不是非常有用的方式這樣做,但它確實滿足了所有要求。
WEBrick
這很簡單,現(xiàn)在讓我們將其插入WEBrick(紅寶石附帶的HTTP服務(wù)器)。為此,我們使用Rack::Handler::WEBrick.run方法,將其傳遞給HelloWorld的實例和要運行的端口。WEBrick服務(wù)器現(xiàn)在將運行,機架將在HTTP服務(wù)器和您的應(yīng)用程序之間傳遞請求胃病小知識。
請注意,這不是推出機架產(chǎn)品的理想方式。它'僅在此處顯示,以便在潛入另一個名為"Rackup,"如下所示的機架功能之前運行某些東西。以這種方式使用Rack::Handler有一些問題。首先,它不是很可配置的。一切都被硬編碼到腳本中。其次,正如您將注意到的那樣,如果您運行以下腳本,則無法殺死該程序。它不會響應(yīng)Ctrl-C。如果運行此命令,只需關(guān)閉終端風ow并打開一個新的。
#!/usr/bin/env ruby
require'rack'
class HelloWorld
def call(env)
return[200,{},["Hello world!"]]
結(jié)束
結(jié)束
機架::處理器::WEBrick.run(
HelloWorld.new,
:Port=>9000
)
Rackup
雖然這很容易做到,但通常不使用機架。機架通常與稱為rackup的工具一起使用。Rackup或多或少地做了上面代碼底部的內(nèi)容,但是以更可用的方式。Rackup從命令行運行,并給出.ru“Rackup文件”。這只是一個紅寶石腳本,除其他外,它將應(yīng)用程序提供給Rackup。
上面非?;镜腞ackup文件看起來像這樣。
類HelloWorld
def call(env)
返回[
200,
{'內(nèi)容類型'=>'text/html'},
[#34;Hello world!"]
]
end
end
runHelloWorld.new
首先,我們必須對HelloWorld類進行一個微小的更改。Rackup正在運行名為Rack::Lint的中間件應(yīng)用程序,該應(yīng)用程序會檢查響應(yīng)是否正確。所有HTTP響應(yīng)都應(yīng)該有一個內(nèi)容類型標題,以便添加。然后,最后一行只是創(chuàng)建應(yīng)用程序的一個實例,并將其傳遞給run方法。理想情況下,您的應(yīng)用程序不應(yīng)完全寫入Rackup文件中,此文件應(yīng)要求您的應(yīng)用程序進入其中并以這種方式創(chuàng)建實例。Rackup文件只是“膠水”,不應(yīng)該有真正的應(yīng)用程序代碼。
如果你運行命令109 rackuphelloworld.ru,它將在端口9292上啟動服務(wù)器。這是默認的Rackup端口。
Rackup有一些更有用的功能。首先,可以在命令行或腳本中的特殊行中更改端口等內(nèi)容。在命令行上,只需輸入-p port參數(shù)即可。例如:rackup-p 1337 helloworld.ru。從腳本本身來看,如果第一行以#\開頭,那么它的解析就像命令行一樣。所以你也可以在這里定義選項。如果您想在端口1337上運行,Rackup文件的第一行可以讀取##\-p 1337。