路由定义在模型的构造方法中。在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!"; };