路由定義在模型的構造方法中。在Nancy中定義路由,須要使用這個格式:
html
方法
+ 匹配模式
+ Action
+ (可選) 條件
.git
例如github
public class ProductsModule : NancyModule{ public ProductsModule() { Get["/products/{id}"] = _ => { //do something }; } }
or async:正則表達式
public class ProductsModule : NancyModule{ public ProductsModule() { Get["/products/{id}", runAsync: true] = async (_, token) => { //do something long and tedious }; } }
這裏的方法是指用來訪問資源的 HTTP方法 ,Nancy支持這些方法 DELETE
, GET
, HEAD
, OPTIONS
, POST
, PUT
and PATCH
.express
默認狀況下,HEAD請求會自動處理爲GET請求,若是須要手工處理HEAD請求須要StaticConfiguration.EnableHeadRouting
設置爲true。async
路由還須要指定匹配模式,一個指定的URL能夠匹配到適合的路由中。能夠自定義匹配規則,但使用Nancy默認的實現能夠支持捕獲以下的一些組合:ide
注意:每一個模式都有個在括號中的score(優先級) - 查看後邊的「匹配模式優先級」。函數
文本片斷 - (10,000) - /some/literal/segments
須要徹底匹配。url
捕獲片斷 - (1,000) - /{name}
將請求url中捕獲的片斷傳遞到路由的Action。 spa
捕獲片斷 *(可選項)* - (1,000) - /{name?}
片斷名稱後添加了問號表示該項爲可選項。
捕獲片斷 *(可選項/默認值)* - (1,000) - /{name?unnamed}/
在問號後能夠指定一個默認值。
表達式片斷 - (1,000) - /(?<age>[\d]{1,2})
使用 Named Capture Grouped 正則表達式 , 提供更強功能. 若是你須要將條件取反能夠問號後添加冒號(?:regex-goes-here)
貪婪匹配片斷 - (0) - /{name*}
片斷名後添加型號, 這個片斷模式將匹配/後全部內容.
貪婪正則片斷 - (100) - ^(?<name>[a-z]{3,10}(?:/{1})(?<action>[a-z]{5,10}))$
組合了正則和貪婪匹配的片斷, 將捕獲/後的整個路徑, 這個片斷必須 ^ 開頭
而且以$
結束,以便咱們能夠知道貪婪正則片斷的開始和結束。
多重捕獲片斷 - (100) - /{file}.{extension}
or /{file}.ext
包含捕獲匹配和文本匹配的片斷。
模式片斷能夠以任何順序組合來建立一個複雜的路由。貪婪匹配模式會盡量多地匹配字符。貪婪模式匹配時候會匹配請求url中的所有符合的內容,直到url的結尾或者是遇到另外一符合片斷。
有些時候兩個路由提供的時候是反過來不適合的順序(第一個路由會覆蓋第二路由的匹配)例以下邊:
public class HomeModule : NancyModule { public HomeModule() { Get["/{category}"] = parameters => "My category is " + parameters.category; Get["/sayhello"] = _ => "Hello from Nancy"; } }
第一個路由包括捕獲片斷,第二個路由是文本片斷。(在其餘系統中,符合了第一個,就不會判斷第二個路由,而在nancy中)經過路由優先級進行匹配。
文本類型的優先級是10000,捕獲類型的優先級是1000,若是同時符合兩個路由,則取優先級高的。例如
咱們瀏覽http://www.site.com/sayhello的時候,由於第二個路由的優先級是10000,因此會匹配第二個路由並執行第二個路由下的方法。
路由動做是當請求符合路由時執行的一個行爲。它是一個Func<dynamic, dynamic>類型的lambda表達式,動態類型輸入數據是一個DynamicDictionary,是一個在Nancy中指定的動態類型,該類型的說明見DynamicDictionary 簡介。
響應數據能夠是任何模型,最終的結果經過Content Negotiation(內容協商)肯定。若是是typeResponse,內容協商會被忽略,而且響應會直接返回到主機。
Response
對象聲明瞭一些隱式轉換操做符,能夠在路由動做執行中一併返回,而不是返回Response
object,(能夠明確地返回數據類型) 隱式轉換能夠爲以下類型:
HTTP相應狀態碼轉爲int
HttpStatusCode
枚舉類型
響應正文會轉換爲string
寫入到響應流的函數轉換爲Action<Stream>
最後的部分是可選的條件,能夠肯定一個路由是否符合指定的條件。好比用來肯定路由只被移動設備調用。路由條件可使用lambda表達式或Func<NancyContext, bool>委託類型定義。
Post["/login", (ctx) => ctx.Request.Form.remember] = _ => { return "Handling code when remember is true!"; }; Post["/login", (ctx) => !ctx.Request.Form.remember] = _ => { return "Handling code when remember is false!"; };