3.1 Defining routes 定義路由(上) (Nancy 官方文檔翻譯)

路由定義在模型的構造方法中。在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支持這些方法 DELETEGETHEAD,  OPTIONSPOSTPUT  and PATCH.express

默認狀況下,HEAD請求會自動處理爲GET請求,若是須要手工處理HEAD請求須要StaticConfiguration.EnableHeadRouting 設置爲true。async


匹配模式


路由還須要指定匹配模式,一個指定的URL能夠匹配到適合的路由中。能夠自定義匹配規則,但使用Nancy默認的實現能夠支持捕獲以下的一些組合:ide


注意:每一個模式都有個在括號中的score(優先級) - 查看後邊的「匹配模式優先級」。函數


  1. 文本片斷 - (10,000) - /some/literal/segments 須要徹底匹配。url

  2. 捕獲片斷 - (1,000) - /{name} 將請求url中捕獲的片斷傳遞到路由的Action。 spa

  3. 捕獲片斷 *(可選項)* - (1,000) - /{name?} 片斷名稱後添加了問號表示該項爲可選項。

  4. 捕獲片斷 *(可選項/默認值)* - (1,000) - /{name?unnamed}/ 在問號後能夠指定一個默認值。

  5. 表達式片斷 - (1,000) - /(?<age>[\d]{1,2}) 使用 Named Capture Grouped 正則表達式 , 提供更強功能. 若是你須要將條件取反能夠問號後添加冒號(?:regex-goes-here)

  6. 貪婪匹配片斷 - (0) - /{name*} 片斷名後添加型號, 這個片斷模式將匹配/後全部內容.

  7. 貪婪正則片斷 - (100) - ^(?<name>[a-z]{3,10}(?:/{1})(?<action>[a-z]{5,10}))$ 組合了正則和貪婪匹配的片斷, 將捕獲/後的整個路徑, 這個片斷必須 ^ 開頭 而且以$ 結束,以便咱們能夠知道貪婪正則片斷的開始和結束。

  8. 多重捕獲片斷 - (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,因此會匹配第二個路由並執行第二個路由下的方法。


Action(路由動做)


路由動做是當請求符合路由時執行的一個行爲。它是一個Func<dynamic, dynamic>類型的lambda表達式,動態類型輸入數據是一個DynamicDictionary,是一個在Nancy中指定的動態類型,該類型的說明見DynamicDictionary 簡介


響應數據能夠是任何模型,最終的結果經過Content Negotiation(內容協商)肯定。若是是typeResponse,內容協商會被忽略,而且響應會直接返回到主機。


Response 對象聲明瞭一些隱式轉換操做符,能夠在路由動做執行中一併返回,而不是返回Responseobject,(能夠明確地返回數據類型) 隱式轉換能夠爲以下類型:


  1. HTTP相應狀態碼轉爲int 

  2. HttpStatusCode 枚舉類型

  3. 響應正文會轉換爲string

  4. 寫入到響應流的函數轉換爲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!";
};
相關文章
相關標籤/搜索