ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-06-18 08:01:59  阅读:159  来源: 互联网

标签:core return 约束 重新整理 net swagger true public 路由


前言

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

正文

路由方式主要有两种:

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],如果没有那么可能是生成失败了。

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

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

标签:core,return,约束,重新整理,net,swagger,true,public,路由
来源: https://www.cnblogs.com/aoximin/p/14882156.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有