重新整理 .net core 实践篇—————路由和终结点[二十三]

摘要:
在前言中,我将简单地整理路线和终点节点。上面的一个属于RouteAttribute,因此应该设置为:appUseEndpoints;有了这些约束,我们的代码将更干净。如上所示,MyRouteConstraint约束是自定义的。publicclassMyRouteConstraint:IRouteConstraint{publicboolMatch{if{varv=values[routeKey];if{returntrue;}}returnfalse;}}然后将服务添加到路由AddRouting;如果找不到显示的xml,请添加<GenerateDocumentationFile>true</GenerateDocumentationFile>如果显示:undefined/swagger/V1/swagger通常,在我们为json编写了一些代码之后,应该不会出现配置错误。在restful风格中,如果它是一个路由约束,并且所有东西都是一个资源,那么这个资源不存在,应该显示为404。

前言

简单整理一下路由和终节点。

正文

路由方式主要有两种:

1.路由模板方式

2.RouteAttribute 方式

路由约束:

1.类型约束

2.范围约束

3.正则表达式

4.是否必选

5.自定义 IRootConstaint

URL 生成

1.LinKGenerator

2.IUrlHelper

先搭建一个swagger:

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

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

然后创建一个controller:

[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;
	}
}

看到在每个action上都有一些配置,上面就是约束。

上面这种属于RouteAttribute,故而应该设置:

app.UseEndpoints(endpoints =>
{
       endpoints.MapControllers();
});

有了这些约束呢,我们的代码将会更加的整洁。因为我们每次获取参数的时候都应该判断是否符合规格,不符合返回404。有了这些配置我们少写很多重复性代码。

上面看到,自定义了MyRouteConstraint 约束。

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;
	}
}

然后在路由中加入:

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

如果显示xml找不到,加上。

 <GenerateDocumentationFile>true</GenerateDocumentationFile>

如果是显示:undefined /swagger/V1/swagger.json

一般来说,我们写过一些代码后,应该不会出现什么配置错误。

因为swagger要求比较严格,查看一下,自己写的action,上有没有标注[httpget]或者[httppost],如果没有那么可能是生成失败了。

重新整理 .net core 实践篇—————路由和终结点[二十三]第1张

这里显示了404,那么不应该是显示400吗? 如果是restful 风格来说,属于路由约束,一切皆资源的角度上,这个资源不存在,是应该显示404的。

下一节 简单搭建一个基础项目。

免责声明:文章转载自《重新整理 .net core 实践篇—————路由和终结点[二十三]》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mysql命令详解MySql 常见错误代码大全 VV2下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Flutter实战视频-移动电商-39.路由_Fluro的路由配置和静态化

39.路由_Fluro的路由配置和静态化 handler只是单个路由的配置,这节课我们要学习路由的整体配置 整体配置 新建routers.dart文件来做整体配置 detailsHandler就是我们在router_handler里面定义的detailsHandler 当路由不存在的时候,给用户一个反馈。router.notFoundHandler 这...

Rabbitmq的死信

一、概述 死信有死信队列、死信交换器和死信消息组成。死信消息则有如下三种情况生成: 1.消费者使用basic.reject或 basic.nack并将requeue参数设置为false来拒绝该消息 2.消息设置了TTL过期时间,过期时间内没有消费导致过期 3.消息因超过队列长度导致被丢弃 如果队列删除或者队列的TTL过期时间到了被删除其中的消息是不会成为死...

OSPF 做负载均衡

使用OSPF做负载均衡探究 一、OSPF产生背景 随着互联网的快速发展,为了满足建造越来越大基于IP网络的需要,不得不把网络逻辑结构划分为一个个单一自治系统。 二、OSPF技术原理 OSPF(Open Shortest Path First开放式最短路径优先 )是一个内部网关协议(Interior Gateway Protocol,简称IGP),用于在单一...

uniapp路由插件使用爬坑

插件官网地址:https://hhyang.cn/v2/start/quickstart.html 一.安装路由插件: npm install uni-simple-router 二.配置路由: 1.编写路由代码: //src/router/index.js import {RouterMount,createRouter} from 'uni-simpl...

OSPF协议总结

总结: 1、ospf协议报文不会泛洪扩散,而是逐级路由器处理后,再从所有ospf启用端口发送出去,也就是说,只能从邻居接收到ospf报文,报文的源ip是邻居的ip地址,目的ip是组播ip. 2、开启ospf协议的端口有两种方式,一种是通过ospf视图下的network x.x.x.x,另外一种是在端口视图下输入 ospf area x enable 。 3...

thinkphp3.2.3中设置路由,优化url

需求:访问这个目录的时候,http://xx.com/p-412313要重定向到(暂且这么叫)http://xx.com/Home/Blog/index/id/412313 就是看着好看 我的应用目录是Application。模块是Home 第一步:知道哪个文件怎么处理的路由路由处理在think/Route.class.php [php]view p...