Nancy in .NET Core学习笔记 - 路由

前文中,我介绍了Nancy的来源和优点,并创建了一个简单的Nancy应用,在网页中输出了一个"Hello World",本篇我来总结一下Nancy中的路由 Nancy中的路由的定义 Nancy中的路由是定义在每个Module的构造函数中的。 为了创建一个路由,你需要定义如下4个部分 Http请求的方法(Method) 路由模板(Pattern) 处理对应路由模板请求的响应方法(Action) 条件约束(Condition) 以前篇的代码为例 public class HelloModule : NancyModule { public HelloModule() { Get("/", p => "Hello World"); } } 当前构造中定义了的一个路由 它的Http请求方法是GET 它的路由模板是"/", 即网站根目录 它的响应结果是输出一个"Hello World" 这里它没有指定任何的条件约束 Nancy中支持的Http请求方法(Http Method) Nancy中支持DELETE, GET, HEAD, OPTIONS, POST, PUT和PATCH Nancy中的路由模板(Pattern) 下面我们介绍一下Nancy中默认提供的几种路由片段和约束条件。 Nancy中的几种路由片段 Nancy中默认支持一下几种路由片段。 纯文字片段(Literal Segment) 例: /products/cocacola public class ProductModule : NancyModule { public ProductModule() { Get("/products/cocacola", p => "Coca Cola"); } } 含变量的片段(Capture Segment) Nancy中Get方法的第二个参数是一个Func委托, Func, 该委托的指向方法的第一个参数是dynamic类型的变量, 我们可以从该变量上获取Url中的可变参数的值。 例: /products/{productName} public class ProductModule : NancyModule { public ProductModule() { Get("/products/{productName}", p => p.productName); } } 含可空变量的片段(Capture Segment - Optional) Nancy中的Url参数也支持可空类型, 只需要在参数后面加一个问号。 例:/products/{productName?} public class ProductModule : NancyModule { public ProductModule() { Get("/products/{productName?}", p => p.productName == null ? "Missing the name" : p.productName); } } Nancy中对于可空类型的参数也可以设置默认值, 默认值可以放在问号的后面。 例:/products/{productName?defaultName} public class ProductModule : NancyModule { public ProductModule() { Get("/products/{productName?defaultName}", p => p.productName); } } 正则片段(RegEx Segment) Nancy的路由模板中也可以使用正则表达式。 例:/products/(?[\d]{2,}) public class ProductModule : NancyModule { public ProductModule() { Get(@"/products/(?[\d]{2,})", p => "Your product id is " + p.productId); } } 这个正则的意思是只允许2位数以上的整数。 贪婪片段(Greedy Segment) Nancy中可以在变量尾部追加一个星号,表示匹配从当前位置到Url结尾的所有字符串。 例:/products/{productName*} public class ProductModule : NancyModule { public ProductModule() { Get("/products/{productName*}", p => p.productName); } } 现在我们把星号去掉看一下区别。 例:/products/{productName} 不能匹配到任何路由模板。 优先级别 在ASP.NET MVC中我们会使用MapRoute方法定义的路由模板,当有请求进入的时候,MVC Handler会根据我们定义的路由模板顺序来依次匹配, 如果匹配成功就会进入对应的Action方法处理请求。 那么在Nancy这种无配置的框架中如何确定模板的匹配顺序呢? 在Nancy中,对于默认提供的几种路由片段类型,Nancy都提供了一个模板分数(Pattern Scoring),模板分数越高的越优先匹配。 Nancy中几种基本模板类型的分数 模板 分数 纯文字片段(Literal Segment) 10000 含变量的片段(Capture Segment) 1000 含可空变量的片段(Capture Segment - Optional) 1000 正则片段(RegEx Segment) 1000 贪婪正则片段(Greedy RegEx Segment) 100 多变量片段(Multiple Captures Segment) 100 贪婪片段(Greedy Segment) 0 例:当前有2个路由模板"/products/{productName}"和"/products/coffee",我们请求Url为/products/coffee时,结果如下 public class ProductModule : NancyModule { public ProductModule() { Get("/products/{productName}", p => p.productName); Get("/products/coffee", p => "Hello Coffee."); } } 这里是因为纯文字片段的优先级别比含变量的片段高,所以优先处理了当前请求。 路由片段参数类型约束 Nancy还可以在路由模板中对参数类型进行约束。约束的格式是"{变量名: 约束类型}"。 例: "/products/{productId:int}" public class ProductModule : NancyModule { public ProductModule() { Get("/products/{productId:int}", p => "Product id is " + p.productId); } } 当约束条件匹配时,请求成功。 当约束条件不匹配时,请求失败。 常规约束 Nancy中提供如下的常规约束类型。 约束类型 解释说明 int 只允许Int32的数字 long 只允许Int64的数字 decimal 只允许小数 guid 只允许Guid bool 只允许true/false alpha 只允许字母 datetime 只允许时间 datetime(format) 只允许特定格式时间 min(mininum) 允许的最小整数值 max(maxinum) 允许的最大整数值 range(mininum, maxinum) 允许的整数值范围 minlength(length) 允许的字符串最小长度 maxlength(length) 允许的字符串最大长度 length(length) 允许的字符串长度范围 version 只允许版本号,例1.0.0 自定义约束 Nancy中可以通过继承RouteSegmentConstraintBase 和ParameterizedRouteSegmentConstraintBase来自定义约束条件。 RouteSegmentConstraintBase - 不带参数约束条件的积累 ParameterizedRouteSegmentConstraintBase - 带参数约束条件的基类 下面我们自己创建一个email约束。 首先我们创建一个EmailRouteSegmentConstraint类,并继承RouteSegmentConstraintBase类,其代码如下 public class EmailRouteSegmentConstraint : RouteSegmentConstraintBase { public override string Name { get { return "email"; } } protected override bool TryMatch(string constraint, string segment, out string matchedValue) { if (segment.Contains("@")) { matchedValue = segment; return true; } matchedValue = null; return false; } } 其中TryMatch方法表示尝试判断参数是否匹配,如果返回true就是匹配成功,false就是匹配失败。Name属性表示了当前约束的名称。 我们创建一个新的StaffModule类,其代码如下 public class StaffModule : NancyModule { public StaffModule() { Get("/staff/{email:email}", p => "Your email is " + p.email); } } 下面我们启动项目,在浏览器中输入/staff/lamondlu@qq.com,请求被正确处理。 这时如果我们在浏览器中输入/staff/lamondlu, 系统会返回404。 Nancy中的条件约束(Condition) Nancy中还可以实现针对请求的一些条件约束。 例如:当提交的Form中包含email字段,且email字段的值为lamondlu@qq.com时才处理当前请求。 public class StaffModule : NancyModule { public StaffModule() { Post("/staff", p => "Submited", p => p.Request.Form.email == "lamondlu@qq.com"); } } 这里我加入了第三个参数condition, condition是一个Func类型的委托, 从NancyContext中我们可以获得请求的所有信息。这里我从请求的Form中读取的email字段,如果email字段的值是lamondlu@qq.com, Nancy将返回一个Submited文本。 下面我们使用Postman来测试一下。 首先我们在Form中不加入任何字段,请求结果如下。 然后我们在Form中加入email字段,且值为lamondlu@qq.com, 请求结果如下。 请求被正确处理了。 以上就是Nancy路由部分的全部内容,有兴趣的同学可以加我的QQ:309728709一起研究, 下一次我将分享Nancy中的视图引擎。 附源代码 知识共享许可协议 作者:Lamond Lu 出处:https://www.cnblogs.com/lwqlun/p/9607652.html 本站使用「署名 4.0 国际」创作共享协议,转载请在文章明显位置注明作者及出处。 分类: NET Core 好文要顶 关注我 收藏该文 LamondLu 关注 - 1 粉丝 - 25 +加关注 5 0 « 上一篇:Nancy in .Net Core学习笔记 - 初识Nancy posted @ 2018-09-08 00:19 LamondLu 阅读(153) 评论(3) 编辑 收藏 https://www.cnblogs.com/lwqlun/p/9607652.html
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信