rack介紹

原文[url]http://chneukirchen.org/blog/archive/2007/02/introducing-rack.html[/url]
在web框架實踐中我感到痛苦,我發現有許多本質上做相同事情的重複代碼。
而每一個ruby web框架開發者還在不斷的開發出他需要的web服務程序。
但願,框架使用者爲他們的選擇感到滿意。
然而,從本質上說,處理HTTP是很容易的。就是你獲得一個請求,返回一個響應。
我們可能這樣做這件事:由一個類CGI環境接收一個標準http請求的hash,
返回一個由三部分(狀態status,頭headers,主體body)組成的響應。

這可以很容易地映射爲一個ruby方法調用,如下範例

class HelloWorld
def call(env)
[200, {"Content-Type" => "text/plain"}, ["Hello world!"]]
end
end

你所看到就是一個最簡單的Rack應用程序

Rack的目標是提供一個最小的API連接到web servers和web框架

非正式情況下,一個Rack應用程序會調用一個帶hash參數的#call方法,
它返回一個由status, headers, body組件的數組。body需要調用#each方法,它一個接一個的返回字符串到body中。
這個給定的hash參數包含一個環境變量的CGI-ish集合和一些特定值,
(env['rack.input'])或者有關運行時環境的信息(例如env['rack.run_once'])

請記住Rack主要是用於框架開發者,通常不暴露給框架使用者,rack剛開始看起來也許有點笨拙,
或者你也許期望更多"優美"的API,但API就應該是簡單的(可方便用作lambda)而不是難於接受(暴露的適配器僅僅只有5行代碼)


在上面這個最小化API裏,有一個庫爲經常做的事(像query parsing或cookie處理)提供了很多便利(Rack::Requrest和Rack::Response),
願意的話,你可以免費使用。

但是Rack真正酷的地方在於它提供了一種極其簡單的方式組合web應用程序,
畢竟,它僅僅是Ruby對象和它的一個方法的事。而且調用#call不必是一個真實的web server,也可以是另一個程序!
讓我向你展示一些已經存在的Rack filters(或者叫中間件):
[list]
[*]Rack::ShowExceptions 捕獲所有拋出的異常然後用500-page包裝好它們,源自Django(一個python web框架)
[*]Rack::CommonLogger Apache風格的日誌
[*]Rack::URLMap 根據path和host跳轉到不同的Rack應用程序(一個非常簡單的路由)
[/list]
還有另一個工具,Rack::Lint,它檢查你的應用程序和filter和其他的filter在一起是否運行良好

如果你的web框架支持Rack,有以下好處:
[list]
[*]提供一個Rack處理器爲web servers工作
[*]在沒有擴展配置的情況下讓多個應用跑在一個web servers上
[*]易於測試(集成和功能測試),從此任何東西可mocked. (Helpers for this are coming soon, too.)
[*]一個很大的不同,從此程序員可以專注於特別的部分上,而停止在煩人的事情上浪費時間。
[*]更多協作特性: 比較 “That upload handler you wrote for IOWA is really great, too bad I use Camping.” 和 “That upload handler you wrote for Rack works great for me too!”
[/list]
Rack由Camping[url]http://code.whytheluckystiff.net/camping/[/url]和ramaze[url]http://ramaze.rubyforge.org/[/url]提供支持
email:[email protected]
irc:chris2@#ruby-lang on FreeNode
Rack主頁[url]http://rack.github.com/[/url]
一個教程[url]http://asciicasts.com/episodes/151-rack-middleware[/url]
發佈了24 篇原創文章 · 獲贊 0 · 訪問量 2778
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章