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, object>, 该委托的指向方法的第一个参数是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/(?<productId>[\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<string>
{
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, bool>类型的委托, 从NancyContext中我们可以获得请求的所有信息。这里我从请求的Form中读取的email字段,如果email字段的值是lamondlu@qq.com, Nancy将返回一个Submited文本。
下面我们使用Postman来测试一下。
首先我们在Form中不加入任何字段,请求结果如下。

然后我们在Form中加入email字段,且值为lamondlu@qq.com, 请求结果如下。

请求被正确处理了。
以上就是Nancy路由部分的全部内容,有兴趣的同学可以加我的QQ:309728709一起研究, 下一次我将分享Nancy中的视图引擎。
Nancy in .NET Core学习笔记 - 路由的更多相关文章
- Nancy in .Net Core学习笔记 - 初识Nancy
前言 去年11月份参加了青岛MVP线下活动,会上老MVP衣明志介绍了Nancy, 一直没有系统的学习一下,最近正好有空,就结合.NET Core学习总结了一下. 注: 本文中大部分内容都是对官网文档的 ...
- Nancy in .Net Core学习笔记 - 视图引擎
前文中我们介绍了Nancy中的路由,这一篇我们来介绍一下Nancy中的视图引擎. Nancy中如何返回一个视图(View) 在ASP.NET Mvc中,我们使用ViewResult类来返回一个视图.N ...
- Asp.net core (学习笔记 路由和语言 route & language)
https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.1 https://doc ...
- .NET CORE学习笔记系列(2)——依赖注入【1】控制反转IOC
原文:https://www.cnblogs.com/artech/p/net-core-di-01.html 一.流程控制的反转 IoC的全名Inverse of Control,翻译成中文就是“控 ...
- .NET CORE学习笔记系列(2)——依赖注入[7]: .NET Core DI框架[服务注册]
原文https://www.cnblogs.com/artech/p/net-core-di-07.html 包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的IS ...
- .NET CORE学习笔记系列(2)——依赖注入[6]: .NET Core DI框架[编程体验]
原文https://www.cnblogs.com/artech/p/net-core-di-06.html 毫不夸张地说,整个ASP.NET Core框架是建立在一个依赖注入框架之上的,它在应用启动 ...
- .NET CORE学习笔记系列(2)——依赖注入[5]: 创建一个简易版的DI框架[下篇]
为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在上篇中我们介绍了Cat的基本编程模式,接下来我们就来聊聊Cat的 ...
- .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]
原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...
- .NET CORE学习笔记系列(2)——依赖注入【3】依赖注入模式
原文:https://www.cnblogs.com/artech/p/net-core-di-03.html IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架中以实现对流 ...
随机推荐
- mysql查询出近一周,三个月,一年的数据
SELECT * FROM 表名 WHERE 时间字段>DATE_SUB(CURDATE(), INTERVAL YEAR) 一年 SELECT * FROM 表名 WHERE 时间字段> ...
- ElasticSearch本人启动报错总结
1.报错关键代码如下: Exception in thread "main" 2019-04-28 03:53:04,339 main ERROR No log4j2 config ...
- 多个PVSS数据点属性读写的优化处理
注:本译文出自15多年前,尚未用最新软硬件平台进行重新测试,只提供方法论层面的参考,具体性能指标不具备参考意义. 多个PVSS数据点属性读写的优化处理 本文档概述了测试三种读取和写入多个PVSS数据点 ...
- Ubuntu 服务器设置软件多用户访问
假设在用户A下安装了软件xx 路径写入$home/.bashrc 这时该软件只有该用户可以使用 若要其他用户也能使用,只需要将该.bashrc拷贝到其他user的$home目录就行了
- JSPatch 热更新
JSPatch 是一个 iOS 动态更新框架,只需在项目中引入极小的引擎,就可以使用 JavaScript 调用任何 Objective-C/Swift 原生接口. 获得脚本语言的优势,为项目动态添加 ...
- DW1000 用户手册中文版 附录3:双向测距(Two-Way Ranging)
由于已经在wode中排版无法直接复制到博客中,故本节博客发布使用了图片. 论坛可下载PDF http://bphero.com.cn/forum.php?mod=viewthread&tid ...
- 加固后,上传play store, 在 google play store 下载应用安装后,打开签名校验失败
在Google Play Console. (Google Play App Signing )签署您的应用 在创建应用时: 会有个“ Google Play App Signing” 的东西,提示使 ...
- hadoop2-elasticsearch的安装
本文主要讲elasticsearch-2.2.1的安装过程. 准备工作: 1.搭建虚拟机 你需要先参考 hadoop2集群环境搭建 把你的虚拟机搭建起来-hadoop环境可以先不用搭建(完成步骤1到步 ...
- c#发送短息验证码
<add key="WebReference.Service.PostUrl" value="http://106.ihuyi.cn/webservice/sms1 ...
- iOS 开发中单元格cell高度自适应
高度自适应分下面两种情况 1.用代码自定义的cell 用代码自定义的cell,cell高度自定义需要我们手动的去计算每个cell的字符串高度.然后返回对应的高度即可. 2.用XIB 或者 StoreB ...