A-A+

Defining routes 定义路由(上) (Nancy 官方文档翻译)

2016年01月27日 站长资讯 暂无评论

路由定义在模型的构造方法中。在Nancy中定义路由,需要使用这个格式:

方法 + 匹配模式 + Action + (可选) 条件。

例如:

  1. public class ProductsModule : NancyModule{    public ProductsModule()  
  2.     {  
  3.         Get["/products/{id}"] = _ =>  
  4.         {            //do something  
  5.         };  
  6.     }  
  7. }  
  8. or async:  
  9. public class ProductsModule : NancyModule{    public ProductsModule()  
  10.     {  
  11.         Get["/products/{id}", runAsync: true] = async (_, token) =>  
  12.         {            //do something long and tedious  
  13.         };  
  14.     }  
  15. }  

方法

这里的方法是指用来访问资源的 HTTP方法 ,Nancy支持这些方法 DELETE, GET, HEAD, OPTIONS, POST, PUT and PATCH.

默认情况下,HEAD请求会自动处理为GET请求,如果需要手工处理HEAD请求需要StaticConfiguration.EnableHeadRouting 设置为true。

匹配模式

路由还需要指定匹配模式,一个指定的URL可以匹配到适合的路由中。可以自定义匹配规则,但使用Nancy默认的实现可以支持捕获如下的一些组合:

注意:每个模式都有个在括号中的score(优先级) - 查看后边的“匹配模式优先级”。

文本片段 - (10,000) - /some/literal/segments 需要完全匹配。

捕获片段 - (1,000) - /{name} 将请求url中捕获的片段传递到路由的Action。

捕获片段 *(可选项)* - (1,000) - /{name?} 片段名称后添加了问号表示该项为可选项。

捕获片段 *(可选项/默认值)* - (1,000) - /{name?unnamed}/ 在问号后可以指定一个默认值。

表达式片段 - (1,000) - /(?[\d]{1,2}) 使用 Named Capture Grouped 正则表达式 , 提供更强功能. 如果你需要将条件取反可以问号后添加冒号(?:regex-goes-here)

贪婪匹配片段 - (0) - /{name*} 片段名后添加型号, 这个片段模式将匹配/后所有内容.

贪婪正则片段 - (100) - ^(?[a-z]{3,10}(?:/{1})(?[a-z]{5,10}))$ 组合了正则和贪婪匹配的片段, 将捕获/后的整个路径, 这个片段必须 ^ 开头 并且以$ 结束,以便我们可以知道贪婪正则片段的开始和结束。

多重捕获片段 - (100) - /{file}.{extension} or /{file}.ext 包含捕获匹配和文本匹配的片段。

模式片段可以以任何顺序组合来创建一个复杂的路由。贪婪匹配模式会尽可能多地匹配字符。贪婪模式匹配时候会匹配请求url中的全部符合的内容,直到url的结尾或者是遇到另一符合片段。

匹配模式优先级

有些时候两个路由提供的时候是反过来不适合的顺序(第一个路由会覆盖第二路由的匹配)例如下边:

  1. public class HomeModule : NancyModule  
  2.     {        public HomeModule()  
  3.         {  
  4.             Get["/{category}"] = parameters => "My category is " + parameters.category;  
  5.    
  6.             Get["/sayhello"] = _ => "Hello from Nancy";  
  7.    
  8.         }  
  9.     }  

第一个路由包括捕获片段,第二个路由是文本片段。(在其他系统中,符合了第一个,就不会判断第二个路由,而在nancy中)通过路由优先级进行匹配。

文本类型的优先级是10000,捕获类型的优先级是1000,如果同时符合两个路由,则取优先级高的。例如

我们浏览 http://www.xiaoxiongboke.com 的时候,因为第二个路由的优先级是10000,所以会匹配第二个路由并执行第二个路由下的方法。

Action(路由动作)

路由动作是当请求符合路由时执行的一个行为。它是一个Func类型的lambda表达式,动态类型输入数据是一个DynamicDictionary,是一个在Nancy中指定的动态类型,该类型的说明见DynamicDictionary 简介。

响应数据可以是任何模型,最终的结果通过Content Negotiation(内容协商)确定。如果是typeResponse,内容协商会被忽略,并且响应会直接返回到主机。

Response 对象声明了一些隐式转换操作符,可以在路由动作执行中一并返回,而不是返回Responseobject,(可以明确地返回数据类型) 隐式转换可以为如下类型:

HTTP相应状态码转为int

HttpStatusCode 枚举类型

响应正文会转换为string

写入到响应流的函数转换为Action

条件

最后的部分是可选的条件,可以确定一个路由是否指定的条件。比如可以用来确定路由只被移动设备调用。一个路由条件可以使用lambda表达式或Func类型定义。

  1. Post["/login", (ctx) => ctx.Request.Form.remember] = _ =>   
  2. {  
  3.      return "Handling code when remember is true!";  
  4. };  
  5.    
  6. Post["/login", (ctx) => !ctx.Request.Form.remember] = _ =>   
  7. {  
  8.      return "Handling code when remember is false!";  
  9. };  
标签:

给我留言