博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nancy in .NET Core学习笔记 - 路由
阅读量:5056 次
发布时间:2019-06-12

本文共 5522 字,大约阅读时间需要 18 分钟。

,我介绍了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, PUTPATCH

Nancy中的路由模板(Pattern)

下面我们介绍一下Nancy中默认提供的几种路由片段和约束条件。

Nancy中的几种路由片段

Nancy中默认支持一下几种路由片段。

纯文字片段(Literal Segment)

例: /products/cocacola

public class ProductModule : NancyModule    {        public ProductModule()        {            Get("/products/cocacola", p => "Coca Cola");        }    }

65831-20180908000729662-711102461.png

含变量的片段(Capture Segment)

Nancy中Get方法的第二个参数是一个Func委托, Func<dynamic, object>, 该委托的指向方法的第一个参数是dynamic类型的变量, 我们可以从该变量上获取Url中的可变参数的值。

例: /products/{productName}

public class ProductModule : NancyModule    {        public ProductModule()        {            Get("/products/{productName}", p => p.productName);        }    }

65831-20180908000744254-761214726.png

含可空变量的片段(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);        }    }

65831-20180908000829190-2096982664.png

Nancy中对于可空类型的参数也可以设置默认值, 默认值可以放在问号的后面。

例:/products/{productName?defaultName}

public class ProductModule : NancyModule    {        public ProductModule()        {            Get("/products/{productName?defaultName}", p => p.productName);        }    }

65831-20180908000839818-920331928.png

正则片段(RegEx Segment)

Nancy的路由模板中也可以使用正则表达式。

例:/products/(?[\d]{2,})

public class ProductModule : NancyModule    {        public ProductModule()        {            Get(@"/products/(?
[\d]{2,})", p => "Your product id is " + p.productId); } }

这个正则的意思是只允许2位数以上的整数。

65831-20180908000851705-1424937805.png

贪婪片段(Greedy Segment)

Nancy中可以在变量尾部追加一个星号,表示匹配从当前位置到Url结尾的所有字符串。

例:/products/{productName*}

public class ProductModule : NancyModule    {        public ProductModule()        {            Get("/products/{productName*}", p => p.productName);        }    }

65831-20180908000901562-1453397170.png

现在我们把星号去掉看一下区别。

例:/products/{productName}

65831-20180908000910362-320060814.png

不能匹配到任何路由模板。

优先级别

在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.");        }    }

65831-20180908000923914-772810032.png

这里是因为纯文字片段的优先级别比含变量的片段高,所以优先处理了当前请求。

路由片段参数类型约束

Nancy还可以在路由模板中对参数类型进行约束。约束的格式是"{变量名: 约束类型}"。

例: "/products/{productId:int}"

public class ProductModule : NancyModule    {        public ProductModule()        {            Get("/products/{productId:int}", p => "Product id is " + p.productId);        }    }

当约束条件匹配时,请求成功。

65831-20180908000932774-1227045618.png

当约束条件不匹配时,请求失败。

65831-20180908000941770-1990966985.png

常规约束

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中可以通过继承RouteSegmentConstraintBaseParameterizedRouteSegmentConstraintBase来自定义约束条件。

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,请求被正确处理。

65831-20180908000957442-938339308.png

这时如果我们在浏览器中输入/staff/lamondlu, 系统会返回404。

65831-20180908001007250-1784294209.png

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中不加入任何字段,请求结果如下。

65831-20180908001025946-65525358.png

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

65831-20180908001017714-577655396.png

请求被正确处理了。

以上就是Nancy路由部分的全部内容,有兴趣的同学可以加我的QQ:309728709一起研究, 下一次我将分享Nancy中的视图引擎。

转载于:https://www.cnblogs.com/lwqlun/p/9607652.html

你可能感兴趣的文章
VS 2010打开设计器出现错误
查看>>
SQLServer 镜像功能完全实现
查看>>
Vue-详解设置路由导航的两种方法
查看>>
一个mysql主从复制的配置案例
查看>>
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
dvwa网络渗透测试环境的搭建
查看>>
Win8 安装VS2012 和 Sql Server失败问题
查看>>
过点(2,4)作一直线在第一象限与两轴围成三角形,问三角形面积的最小值?...
查看>>
java aes CBC的填充方式发现
查看>>
使用ionic cordova build android --release --prod命令打包报有如下错误及解决方法
查看>>
BZOJ 2338 HNOI2011 数矩形 计算几何
查看>>
关于页面<!DOCTYPE>声明
查看>>
【AS3代码】播放FLV视频流的三步骤!
查看>>
C++标准库vector使用(更新中...)
查看>>
cocos2d-x 2.2.6 之 .xml文件数据读取
查看>>
枚举的使用
查看>>
BZOJ 1531 二进制优化多重背包
查看>>
BZOJ 2324 (有上下界的)费用流
查看>>
python3基础06(随机数的使用)
查看>>
Zookeeper系列(二)特征及应用场景
查看>>