• .NetCore 3.1和.NetCore 5.0 中WebApi的请求参数的验证方法


    我们在开发WebApi或者asp.net core mvc时,一般都是要对接口的入参进行验证。若入参为一个实体,我们一般用注解的方式(DataAnnotations)+ModelState,或者FluentValidation来验证实体。

    这几种常用的方法我就不总结了,网上有一大堆。参考:

    https://www.cnblogs.com/lwqlun/p/10311945.html

    http://www.zyiz.net/tech/detail-200294.html

    但是若接口的入参不是实体,只是简单的几个参数,我们该怎么校验呢?其实这种情况操作起来更简单,微软早就帮我们准备好方法了。也就是使用路由模板(route template),也就是对路由进行限制。内置的常用的路由模板见官方文档:

    https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.aspnetcore.routing.constraints?view=aspnetcore-5.0

    我们先看下代码:

      /// <summary>
            /// 
            /// </summary>
            /// <param name="id">最大20</param>
            /// <param name="linkGenerator"></param>
            /// <returns></returns>
            [HttpGet("{id:max(20)}")]
            public bool Max([FromRoute]long id, [FromServices]LinkGenerator linkGenerator)
            {
    
                var a = linkGenerator.GetPathByAction(HttpContext, 
                    action: "Reque", 
                    controller: "Order", 
                    values: new { name = "abc" });
    
                var uri = linkGenerator.GetUriByAction(HttpContext, 
                    action: "Reque", 
                    controller: "Order", 
                    values: new { name = "abc" });
                return true;
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="ss">必填</param>
            /// <returns></returns>
            [HttpGet("{name:required}")]
            [Obsolete]
            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;
            }

    看到HttpGet后面括号里的内容了吧,这个就是路由模板。上面只是举几个简单的例子,swagger里效果如下:

    路由模板的格式为 : {参数名:规则},内置的规则有:必填, 时间类型,最大值,最大长度。支持正则表达式,也支持自定义。

    若需要自定义,则需要创建一个类,继承:IRouteConstraint,简单的实现如下:

    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Routing;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace RoutingTest
    {
        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;
            }
        }
    }

    然后在StartUp的ConfigureServices里注册:

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

    使用在Action的方法如下:

            /// <summary>
            /// 
            /// </summary>
            /// <param name="id">必须可以转为long</param>
            /// <returns></returns>
            [HttpGet("{id:MyRC}")]
            public bool OrderExist([FromRoute]string id)
            {
                return true;
            }

    作者:沐雪
    文章均系作者原创或翻译,如有错误不妥之处,欢迎各位批评指正。本文版权归作者和博客园共有,如需转载恳请注明。
    如果您觉得阅读这篇博客让你有所收获,请点击右下方【推荐】
    找一找教程网-随时随地学软件编程 http://www.zyiz.net/

  • 相关阅读:
    问题 K: 找点
    问题 B: 喷水装置(二)(在c++上运行有错误,提交AC了)
    问题 A: 喷水装置(一)
    问题 Q: 最大的数
    问题 O: 寻找最大数(三)
    96.n-1位数
    问题 K: A/B Problem
    问题 D: 某种序列
    被限制的加法
    1031苹果分级
  • 原文地址:https://www.cnblogs.com/puzi0315/p/14993636.html
Copyright © 2020-2023  润新知