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