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

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

正文

路由方式主要有两种:

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>必须可以转为long</param> /// <returns></returns> [HttpGet("{id:MyRouteConstraint}")]// 这里使用了自定义的约束 public bool OrderExist(object id) { return true; } /// <summary> /// /// </summary> /// <param>最大20</param> /// <returns></returns> [HttpGet("{id:max(20)}")]// 这里使用了 Max 的约束 public bool Max(long id) { return true; } /// <summary> /// /// </summary> /// <param>必填</param> /// <returns></returns> [HttpGet("{name:required}")]// 必填约束 public bool Reque(string name) { return true; } /// <summary> /// /// </summary> /// <param>以三个数字开始</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 实践篇—————路由和终结点[二十三]

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

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxzyp.html