Cowboy是基于Erlang實作的一個輕量級、快速、子產品化的http web伺服器。
預設情況下,Cowboy不會做什麼事情。
為了使Cowboy可用,需要映射URL和處理請求的Erlang模型(Module),這個過程,我們稱之為路由(routing)。
當Cowboy接收到一個請求,通過路由,Cowboy就會嘗試去比對到相應請求的主機和資源路徑。如果比對成功,那麼相關的Erlang代碼就會被執行。
每個主機會給出相應的路由規則。Cowboy首先會比對主機,然後嘗試尋找比對的路徑。
在使用Cowboy之前需要先編譯路由。
路由一般定義成以下結構
每個主機包含比對規則(HostMatch)、限制規則(非必須)(Constraints)和一個由路徑組成的路由清單(PathsList)。
由路徑組成的路由清單與主機清單類似。
而路徑(path)包含比對路徑規則、限制規則(非必須)、處理邏輯的module和會被初始化的選項參數。
下面内容為比對文法和限制選項。
比對文法用來關聯主機名字和相應的handler路徑。
主機的比對文法和路徑的比對文法類似,隻有輕微的差別。譬如,他們分隔符是不一樣的。而且主機是從最後開始比對的,而路徑是不是。
(其實說了老半天,這不就是一個普通的URL嘛。URL的前半部分為主機IP或域名,這裡稱之為HOST,即主機。而後半部分為路徑)
除了特殊情況,最簡單的比對就是隻有主機或者隻有路徑的比對。他的值可以為string() 或binary() 類型。
正如你所見,所有的路徑都是由斜杠開始的。注意,下面兩條路徑對于路由而言是一樣的。
而對于主機名,最後有點和沒有點對于路由來說也是一樣的。同樣,在前面多一個點和少一個點也是一樣的。
是以能夠提取主機和路徑的資料段并且存儲在Req 對象供後面使用。我們稱之為值綁定。
綁定文法非常簡單。由冒号字元(:)開頭,一直到資料段的結尾的這個資料段是我們的綁定名稱,會被儲存。
還有一種特殊的綁定名字,它模仿erlang的下劃線變量。任意内容都能與下劃線(_)相比對,但是資料會被丢棄。最有用的場景就是去比對多個域名。
類似地,也可以添加可選内容。中括号内的内容都是可選的。
并且可選内容可以内嵌
還可以使用[...] 來擷取主機名或路徑剩餘的部分。比對主機的時候,需要放在最前面;比對路徑的時候是放在最後面。分别使用cowboy_req:host_info/1 和 cowboy_req:path_info/1 函數可以找到他們。
如果一個綁定變量出現了兩次,那麼隻有這兩個位置的值相同的時候才會比對成功。
在可選變量裡面也是一樣的,在下面這個例子中,如果可選變量有值,必須兩個綁定變量的值都一樣才可比對到。
如果一個綁定變量出現在主機名和路徑當中,他們需要是相同的才能比對。
當然也有兩種特殊情況,第一種使用下劃線變量(_)可以比對任意的主機名和路徑。
第二種,使用通配符星号(*)來比對。
關于這段沒看懂,下面是英文原文:
After the matching has completed, the resulting bindings can be tested against a set of constraints. Constraints are only tested when the binding is defined. They run in the order you defined them. The match will succeed only if they all succeed. They are always given as a two or three elements tuple, where the first element is the name of the binding, the second element is the constraint's name, and the optional third element is the constraint's arguments. The following constraints are currently defined: {Name, int} {Name, function, fun ((Value) -> true | {true, NewValue} | false)} The int constraint will check if the binding is a binary string representing an integer, and if it is, will convert the value to integer. The function constraint will pass the binding value to a user specified function that receives the binary value as its only argument and must return whether it fulfills the constraint, optionally modifying the value. The value thus returned can be of any type. Note that constraint functions SHOULD be pure and MUST NOT crash.
在傳遞給Cowboy之前,定義的結構首先要先編譯。才能是Cowboy有效查找到正确的handler,并執行,而不必重複地解析路由。
編譯通過調用cow_router:compile/1 函數進行。
注意,如果結構不正确,函數會傳回{error, badarg}。
使用cowboy:set_env/3 函數可以更新目前的路由清單。這會應用到所有的監聽器中。
注意,設定之前還是需要編譯的哦。
本文轉自 Ron Ngai 部落格園部落格,原文連結:http://www.cnblogs.com/rond/p/6093431.html ,如需轉載請自行聯系原作者