What is Rack?
Rack是什麼?
Rack給Ruby相關的網路應用程式開發,提供了一個小型、模組化、容易串接的介面。
它將HTTP的請求和回應盡可能簡單的包裝起來,給網路框架(Rails/Sinatra等等)、伺服器和中間的程式(也就是Middleware)提供了統一的API接口,也就是call方法。
Rack介面的規格是需要提供一個可以回應call方法的Ruby物件,這個物件接受環境變數為參數,call方法會回傳一個陣列,包含下面三個值:
簡單來說Rack是一個介面,幫助你的Ruby相關開發框架(Rails/Sinatra)與伺服器溝通。
在Rack還沒出現之前,所有的Ruby網路開發框架都有自己的介面,這樣導致很難寫出網站伺服器同時給他們使用,也沒辦法在不同框架中共享程式碼。而現在所有的Ruby網站框架都使用Rack,包括Rails和Sinatra。
##動手寫Rack
如果電腦有安裝完Ruby,我們可以使用rakeup
這個指令來建立一個簡單的Rack應用程式,而使用rakeup
這個指令需要一個設定檔config.ru
,隨意建立一個資料夾,然後開啟編輯器建立config.ru
這個檔案,ru就是rackup的縮寫,而內容簡單如下:
# config.ru
class HelloWorld
def call(env)
[200, {"Content-Type" => "text/plain"}, ["Hello world!"]]
end
end
run HelloWorld.new
這個檔案符合了Rack的規格,我們建立一個Class產生一個物件,這個物件可以回應call方法,回傳有HTTP狀態、Header、Body這三個值的陣列,我們就可以在終端機以rackup
來執行,應該會看到以下
Puma starting in single mode...
* Version 4.3.5 (ruby 2.6.5-p114), codename: Mysterious Traveller
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://127.0.0.1:9292
* Listening on tcp://[::1]:9292
Use Ctrl-C to stop
這時去localhost:9292 這個網址,就可以看到 Hello world!的字樣。
而其實Rails也是一個Rack的應用程式,查查看Rails裡面一定也有config.ru
這個檔案,內容大概是長這樣
# This file is used by Rack-based servers to start the application.
require_relative 'config/environment'
run Rails.application
我們可以猜到的是Rails.application應該是一個物件,可以回應call方法,並回傳HTTP狀態、Header、Body。
Rails.application
是一個Rails應用程式的主要Rack物件,任何與 Rack 相容的 Web 伺服器,都應該使用Rails.application
物件來執行 Rails 應用程式。
我們所一直使用的Rails,其實就是一個大型的Rack應用程式!
Rack是一個介面,幫助你的Ruby相關開發框架(Rails/Sinatra)與伺服器溝通。而它的規格是提供一個可以回應call方法的Ruby物件,這個物件接受環境變數為參數,call方法會回傳一個陣列,包含下面三個值:
而我們所使用的Rails或Sinatra其實都是一個大型複雜的Rack應用程式。
2.Rack, a modular Ruby webserver interface
3.為你自己學 Ruby on Rails - Rack 應用程式