.NET Core开发实战(第25课:路由与终结点:如何规划好你的Web API)--学习笔记(上)...

25 | 路由与终结点:如何规划好你的Web API

路由系统在 ASP.NET MVC 框架里面就已经存在了,在 ASP.NET Core 框架里面进行了改进

路由系统的核心作用是指 URL 和 应用程序 Controller 的对应关系的一种映射

这个映射关系实际上有两种作用:

1、把 URL 映射到对应的 Controller 对应的 action 上面去

2、根据 Controller 和 action 的名字来生产 URL

.NET Core 提供了两种路由注册的方式:

1、路由模板的方式

2、RouteAttribute 方式

这两种方式分别适用于的场景是不一样的

路由模板的方式是之前传统的方式,可以用来作为 MVC 的页面 Web 配置

现在用的比较多的前后端分离的架构,定义 Web API 的时候使用 RouteAttribute 方式去做

在定义路由,注册路由的过程中间,有一个重要的特性就是路由约束,是指路由如何匹配

有以下简单的几种约束:

1、类型约束

2、范围约束

3、正则表达式

4、是否必选

5、自定义 IRouteConstraint

另外路由系统提供了两个关键的类,用来反向根据路由的信息生产 URL 地址

1、LinkGenerator

2、IUrlHelper

IUrlHelper 与 MVC 框架里面的 MVCHelper 很像

而 LinkGenerator 是全新提供的一个链接生成的对象,可以从容器里面,在任意的位置都可以获取到这个对象,然后根据需要生成 URL 地址

接下来看一下代码

源码链接:
https://github.com/witskeeper/geektime/tree/master/samples/RoutingDemo

为了方便演示,这里先注册了一组 Swagger 的代码,将 Web API 通过 Swagger 的可视化界面输出出来

引入 Swagger 对应 ASP.NET Core 的包

Swashbuckle.AspNetCore

将代码文档 XML 文档注入给 Swagger

services.AddSwaggerGen(c =>
{c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);c.IncludeXmlComments(xmlPath);
});

在中间件里面注册 Swagger

app.UseSwagger();
app.UseSwaggerUI(c =>
{c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});

这样子就可以在界面上看到 Swagger 的界面,并且浏览我们定义的 API

接着是路由的定义 OrderController

namespace RoutingDemo.Controllers
{[Route("api/[controller]/[action]")]// RouteAttribute 的方式[ApiController]public class OrderController : ControllerBase{/// <summary>/// /// </summary>/// <param name="id">必须可以转为long</param>/// <returns></returns>[HttpGet("{id:MyRouteConstraint}")]// 这里使用了自定义的约束public bool OrderExist(object id){return true;}/// <summary>/// /// </summary>/// <param name="id">最大20</param>/// <returns></returns>[HttpGet("{id:max(20)}")]// 这里使用了 Max 的约束public bool Max(long id){return true;}/// <summary>/// /// </summary>/// <param name="ss">必填</param>/// <returns></returns>[HttpGet("{name:required}")]// 必填约束public bool Reque(string name){return true;}/// <summary>/// /// </summary>/// <param name="number">以三个数字开始</param>/// <returns></returns>[HttpGet("{number:regex(^\\d{{3}}$)}")]// 正则表达式约束public bool Number(string number){return true;}}
}

上面用到了自定义约束 MyRouteConstraint

namespace RoutingDemo.Constraints
{public class MyRouteConstraint : IRouteConstraint{public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection){if (RouteDirection.IncomingRequest == routeDirection){var v = values[routeKey];if (long.TryParse(v.ToString(), out var value)){return true;}}return false;}}
}

注册 MyRouteConstraint

services.AddRouting(options =>
{options.ConstraintMap.Add("MyRouteConstraint", typeof(MyRouteConstraint));
});

让它生效之前,需要在中间件注册的位置注入 UseEndpoints,然后对 UseEndpoints 使用 MapControllers

app.UseEndpoints(endpoints =>
{// 使用 RouteAttributeendpoints.MapControllers();
});

通过这样子的方式把 OrderController 的路由注入进来

启动程序,可以看到一共有五个接口

第一个接口是我们实现的自定义约束,点击 try it out 后输入参数

第二个接口约束最大为20

输入5,执行

可以看到响应码是 200

输入25,执行

可以看到响应码是 404,也就说路由匹配失败了

第三个接口因为参数是必须的,所以没办法输入空值,有一个前端的验证

第四个接口以三个数字开始,输入 234,符合正则表达式,响应码 200

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(一)

好吧&#xff0c;这个题目我也想了很久&#xff0c;不知道如何用最简单的几个字来概括这篇文章&#xff0c;原本打算取名《Angular单页面应用基于Ocelot API网关与IdentityServer4ASP.NET Identity实现身份认证与授权》&#xff0c;然而如你所见&#xff0c;这样的名字实在是太…

【翻译】.NET 5 Preview 1 发布

.NET 5 Preview 1 发布去年年底,我们发布了.NET Core 3.0和3.1.这些版本添加了桌面应用程序模型Windows Forms(WinForms)和WPF,ASP.NET Blazor用于构建SPA应用程序和用于构建分布式应用和服务的gRPC模板、用于与gRPC对话丰富的客户端代码生成、REST API服务等等.我们很高兴看到…

Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(二)

上文已经介绍了Identity Service的实现过程。今天我们继续&#xff0c;实现一个简单的Weather API和一个基于Ocelot的API网关。回顾《Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权&#xff08;一&#xff09;》Weather APIWeather API实现非常简单&#xf…

编程 音量键_盘点市面上那些千元级高逼格的键盘 灯光炫酷 多宏编程

随着科技的变化&#xff0c;以及电竞被更多人熟知&#xff0c;也带动了电竞外设的进步&#xff0c;现在更多的人喜欢选择机械键盘。首先机械键盘可以给我们带来超棒的敲击感&#xff0c;无论是玩游戏还是日常办公打字&#xff0c;都绝对是一等一的好。再者机械键盘在高强度使用…

DotNetCore Web应用程序中的Cookie管理

原文来自互联网&#xff0c;由长沙DotNET技术社区编译。如译文侵犯您的署名权或版权&#xff0c;请联系小编&#xff0c;小编将在24小时内删除。限于译者的能力有限&#xff0c;个别语句翻译略显生硬&#xff0c;还请见谅。作者简介&#xff1a;Jon&#xff08;Jonathan&#x…

逆向so_记一次APP的so层算法逆向(七)

“ 前言&#xff1a;初学逆向 请多多指教 好累 感觉每天这样肝 人有点受不了了...”学习到的内容—1、新学习到IDA的一些分析时候的小技巧2、算法还原代码实现的练习(有个参数没有分析出来&#xff0c;后面知道了会补上的)3、在Frida中使用命令行调试的方便方法分析过程—APP登…

C++实现Huffman树

代码如下&#xff1a; #include <iostream> using namespace std; int s1, s2;typedef struct {int weight;int parent, lch, rch; } HTNode, *HuffmanTree;void Select(HuffmanTree &HT, int n, int &s1, int &s2) {int minv;//定义一个临时变量存储最小值…

.NET Core开发实战(第25课:路由与终结点:如何规划好你的Web API)--学习笔记(下)...

25 | 路由与终结点&#xff1a;如何规划好你的Web API自定义约束实现了路由约束接口&#xff0c;它只有一个 Match 方法&#xff0c;这个方法传入了 Http 当前的 httpContext&#xff0c;route&#xff0c;routeKey这个 routeKey 就是我们要验证的 key 值后面两个参数 RouteVal…

微软 Visual Studio 2019 16.5 发布:.NET 移动开发、生产力

微软最新发布了 Visual Studio 2019 16.5 版本&#xff0c;下面来看看主要更新内容&#xff1a;.NET 移动开发首先要讨论的特性是 XAML Hot Reload for Xamarin.Forms。此功能可加快开发速度&#xff0c;并使开发者可以更轻松地在移动应用的用户界面上进行构建、实验和迭代。且…

chrome主题_谷歌Chrome将很快允许用户创建自定义主题

站长之家(ChinaZ.com) 7月31日 消息:据9to5google报道&#xff0c;虽然用户可以通过Chrome Web Store定制主题&#xff0c;但用户要根据自己的独特喜好定制主题却不是一个简单的事。谷歌正寻求通过在Chrome内置一个自定义主题生成器来解决这个问题。Chrome Web Store中有许多传…

使用Magicodes.IE.Excel完成Excel图片的导入和导出

说明本章教程主要说明如何使用Magicodes.IE.Excel进行图片的导入导出。要点配置DTO进行Excel图片导出配置DTO进行Excel图片导入图片导入导出特性说明ExportImageFieldAttributeHeight&#xff1a;高度(默认15)Width&#xff1a;宽度(默认50)Alt&#xff1a;图片不存在时替换文本…

C++未定义行为-数组越界

我们先来看看下面的代码&#xff1a; #include <iostream> using namespace std; const int N 100010; int a[N]; int main() {for (int i 1;i<N;i) a[i] 2;return 0; }当我们写这段代码的时候&#xff0c;编译器就会发生这样的问题。 这是为什么呢&#xff1f;&a…

SuperBenchmarker一个用.NET编写的压测工具

0x01 前言在这之前想必大家对ab(http)与abs(https)也有一些了解,我们今天不去看ab和abs,SuperBenchmarker(sb.exe)是一个压测工具,他是一个受Apache Benchmark的启发,他会在终端窗口为我们显示最终的结果,同时也会在web界面生成一个动态结果。SuperBenchmarker(sb.exe)可以在Wi…

mysql文献综述_文献综述随笔(二十)

一、基本信息标题&#xff1a;中小型酒店管理系统的设计与实现时间&#xff1a;2013来源&#xff1a;厦门大学关键词&#xff1a;MVC;B/S;JAVA EE;JSP;MySQL;瀑布开发模型二、研究内容1.主要内容&#xff1a;系统业务需求、功能需求、系统架构设计、数据库设计1.1功能模块设计&…

五分钟完成 ABP vNext 通讯录 App 开发

ABP vNext&#xff08;后文简称Abp&#xff09;是 Volo 公司堪称艺术品级的应用开发框架&#xff0c;它基于领域驱动设计&#xff08;DDD&#xff09;的思维&#xff0c;创新地采用了模块化的设计。Abp 目前无疑是 ASP.NET Core 开发框架中最先进和最优雅的存在。笔者认为&…

mysql 5.74安装教程_MySQL安装、基本账户安全(5.0以后版本)

-----------MySQL 5.0以后版本的安装-----------MySQL安装安装包学习的必杀绝技——就是阅读包的安装说明(readme & install)文档。----------# rm /etc/my.cnf (安装前执行一下)----------1.Mysql-5.0.40.tar.gz1.1.Source Installation Overview(lines 74 of …

使用GUI工具Portainer.io管控Docker容器

背景5年前容器技术扑面而来&#xff0c;如今已经成为面向云原生开发的基础架构&#xff0c;基于微服务的设计需要部署大量容器&#xff0c;同时强调了友好快速的管理容器。是时候推荐一个轮子Portainer.io&#xff1a;提供GUI界面的容器管理工具&#xff0c;给开发者的工具箱又…

【项目升级】集成Quartz.Net Job实现(一)

这两天的新闻也是越来越多了&#xff0c;不仅Github接手了NPM&#xff0c;还有.NET 5也要新鲜出炉了&#xff08;11月正式发布&#xff09;&#xff0c;当然还有MVP峰会也正在如火如荼的展开&#xff0c;会有哪些好的东西被碰撞出来&#xff0c;也是很期待的。这些天我也简单的…

DevC++如何安装自定义头文件并使用

首先我们打开DevC&#xff0c;然后点击新建。 新建一个控制台应用程序 取一个喜欢的文件名。 然后会出现如下界面。 点击新建单元 将头文件源码放入 找到空白位置&#xff0c;右键&#xff0c;然后点关闭并保存 保存的文件名要为头文件的名字 使用这个头文件时&#xff0c;只…

论ORM之EFCore初篇(快速基于本地数据库实现数据操作)

欢迎大家阅读《朝夕Net社区技术专刊》第6期我们致力于.NetCore的推广和落地&#xff0c;为更好的帮助大家学习&#xff0c;方便分享干货&#xff0c;特创此刊&#xff01;很高兴你能成为忠实读者&#xff0c;文末福利不要错过哦&#xff01;前言&#xff1a;今天准备带大家一站…