zoukankan      html  css  js  c++  java
  • 重新整理 .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 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的。

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

  • 相关阅读:
    simple-LDAP-auth
    User Attributes
    webpack 模块标识符(Module Identifiers)
    详解webpack中的hash、chunkhash、contenthash区别
    [转] 插件兼容CommonJS, AMD, CMD 和 原生 JS
    Exif.js 读取图像的元数据
    [转] 跨域
    [转] 理解Web路由
    [转] React 是什么
    [转] Web MVC简介
  • 原文地址:https://www.cnblogs.com/aoximin/p/14882156.html
Copyright © 2011-2022 走看看