Cowboy的路由機制

路由機制

配置鏈接URL到Erlang模塊(處理對應請求的模塊)的映射就是路由腺阳。
當 Cowboy接收到一個請求時沽一,它會嘗試在給定的分發(fā)規(guī)則中匹配 域名 到對應的資源路徑。如果匹配成功帆阳,那么對應的Erlang 模塊就會被執(zhí)行嗤形。
Cowboy首先會匹配域名,接著嘗試找到匹配的資源路徑岛啸。
Cowboy會將路由規(guī)則編譯后钓觉,再使用。

結構

通用的路由結構是這樣定義的:
Routes= [Host1, Host2, ... HostN].
每一個域名的匹配規(guī)則 包含了 對連接路徑的選項約束和路徑部件的列表坚踩。
Host1= {HostMatch, PathsList}.
Host2= {HostMatch, Constraints, PathsList}.
路徑部件的定義如下:
PathsList= [Path1, Path2, ... PathN].
最后荡灾,每一路徑包含了該路徑自身的匹配規(guī)則以及對應的處理模塊
Path1= {PathMatch, Handler, Opts}.
Path2= {PathMatch, Constraints, Handler, Opts}.

匹配規(guī)則語法

匹配語法規(guī)則用于標識 域名到路徑間的處理handlers。
域名的語法規(guī)則:
HostMatch1= "cowboy.example.org".
HostMatch2= "cowboy.example.org.".
HostMatch3= ".cowboy.example.org".

路徑的語法規(guī)則:

PathMatch= "/hats/:name/prices".
HostMatch= ":subdomain.example.org".
此外,還可以將域名的某一字段保存到Req對象中批幌,再后續(xù)可以使用础锐,這就是值綁定。
PathMatch= "/hats/:name/prices".
HostMatch= ":subdomain.example.org".
比如荧缘,http://test.example.org/hats/wild_cowboy_legendary/prices 將會
把test綁定到subdomain皆警,而wild_cowboy_legendary就會綁定到name,它們可以被cow_req:binding/{2,3}中檢索截粗,綁定的名字必須是一個atom
'_':表示匹配任何內容

約束

匹配域名和路徑完成后信姓,就會檢測是否滿足可選的約束,約束如下:

{Name, function, fun ((Value) -> true | {true, NewValue} | false)}```
int 約束將會檢查 綁定的二進制串是一個int绸罗,或可被轉化成一個int

function約束意推,將會調用給定的約束函數并且返回結果,給定函數必須自己保證不會崩潰的珊蟀。

為了保存Cowboy可以更高效地查找正確的handler模塊菊值,Cowboy會編譯定義好的路由分發(fā)規(guī)則。
編譯的方法是:```cowboy_router:compile/1```
```erlang
Dispatch= cowboy_router:compile([
%% {HostMatch, list({PathMatch, Handler, Opts})}
{'_', [{'_', my_handler, []}]}]),
%% Name, NbAcceptors, TransOpts, ProtoOpts
cowboy:start_http(my_http_listener, 100,  [{port, 8080}], [{env, [{dispatch, Dispatch}]}]
).

如果定義好的路由分發(fā)規(guī)則有錯誤育灸,cowboy_router:compile/1
將會返回{error, badarg}

在線更新路由規(guī)則

通過 cowboy:set_env/3
更新路由的分發(fā)規(guī)則腻窒,連接監(jiān)聽模塊接受新的連接時就會使用新的路由分發(fā)規(guī)則。
cowboy:set_env(my_http_listener, dispatch, cowboy_router:compile(Dispatch)).

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末磅崭,一起剝皮案震驚了整個濱河市儿子,隨后出現的幾起案子,更是在濱河造成了極大的恐慌砸喻,老刑警劉巖典徊,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異恩够,居然都是意外死亡,警方通過查閱死者的電腦和手機羡铲,發(fā)現死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門蜂桶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人也切,你說我怎么就攤上這事扑媚。” “怎么了雷恃?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵疆股,是天一觀的道長。 經常有香客問我倒槐,道長旬痹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮两残,結果婚禮上永毅,老公的妹妹穿的比我還像新娘。我一直安慰自己人弓,他們只是感情好沼死,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著崔赌,像睡著了一般意蛀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上健芭,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天县钥,我揣著相機與錄音,去河邊找鬼吟榴。 笑死魁蒜,一個胖子當著我的面吹牛,可吹牛的內容都是我干的吩翻。 我是一名探鬼主播兜看,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼狭瞎!你這毒婦竟也來了细移?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤熊锭,失蹤者是張志新(化名)和其女友劉穎弧轧,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體碗殷,經...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡精绎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了锌妻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片代乃。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖仿粹,靈堂內的尸體忽然破棺而出搁吓,到底是詐尸還是另有隱情,我是刑警寧澤吭历,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布堕仔,位于F島的核電站,受9級特大地震影響晌区,放射性物質發(fā)生泄漏摩骨。R本人自食惡果不足惜通贞,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仿吞。 院中可真熱鬧滑频,春花似錦、人聲如沸唤冈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽你虹。三九已至绘搞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間傅物,已是汗流浹背夯辖。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留董饰,地道東北人蒿褂。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像卒暂,于是被迫代替她去往敵國和親啄栓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內容