.NetCore 3.1和.NetCore 5.0 中WebApi的请求参数的验证方法
原创
©著作权归作者所有:来自51CTO博客作者沐雪编程人生的原创作品,请联系作者获取转载授权,否则将追究法律责任
我们在开发WebApi或者asp.net core mvc时,一般都是要对接口的入参进行验证。若入参为一个实体,我们一般用注解的方式(DataAnnotations)+ModelState,或者FluentValidation来验证实体。
这几种常用的方法我就不总结了,网上有一大堆。
但是若接口的入参不是实体,只是简单的几个参数,我们该怎么校验呢?其实这种情况操作起来更简单,微软早就帮我们准备好方法了。也就是使用路由模板(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.weizhi.cc/