Asp.NetCore3.1 WebApi中模型验证
前言
不管是前端,还是后端,做数据合法性验证是避免不了的,这边文章就记录一下Asp.NetCore3.1 WebApi中的模型验证;
传统写法--不使用模型验证
来,先上图:
我相信,应该绝大多数人都这样写过,反正我是,现在有时候也写,不是说这样不行, 根据业务场景进行评估,看是否合适; 这里就那用户维护新增举个例;如上图, 判断参数合法性一堆,这显得这个接口方法比较臃肿;
使用模型验证
先上图
首先在参数模型上打上注解
接口方法优化
如上图,是不是看着这个方法比较清晰了,没那么臃肿了,代码量似乎也就减少了,出Bug的概率是不是也降低了,哈哈;
调用结果,我这里什么都没传,返回400及校验消息(消息可以自定义)
如上图,当参数都为空时,在没进Action之前就被拦截了,并且返回400和校验的错误消息, 这是.NetCore自动校验了,我们可以将其关闭,让访问到Action中来,如下:
在运行进行API调用,同样传递不合法参数,这下就会走到Action中了,如下:
显然,通过这样的方式,可以管控到验证结果,并根据验证结果返回对应信息,但是,这样会需要在每个控制器中需要验证的Action方法中进行判断和处理,这无疑使得代码的复用性不好,写重复的代码,所以我们需要自己控制模型验证结果,又要保证代码整洁的需求下,我们通常自定义中间件或过滤器的方式进行请求拦截处理。下面用过滤器的方式进行处理。
使用Action过滤器
首先定义一个消息返回类,用于所有接口消息规范返回格式,当然,这不是必须的;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /// <summary> /// 公用的返回消息格式 /// </summary> public class ReturnMsg { /// <summary> /// 返回的Code /// </summary> public string Code { get ; set ; } /// <summary> /// 消息 /// </summary> public string Msg { get ; set ; } /// <summary> /// 返回的数据 /// </summary> public string Data { get ; set ; } } |
然后自定义Action过滤器,我在.NetCore3.1环境下实现,使用的是Attribute的形式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public class ModelValidateActionFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext context) { if (!context.ModelState.IsValid) { //公共返回数据类 ReturnMsg returnMsg = new ReturnMsg() { Code = "-1" }; //获取具体的错误消息 foreach ( var item in context.ModelState.Values) { //遍历所有项目的中的所有错误信息 foreach ( var err in item.Errors) { //消息拼接,用|隔开,前端根据容易解析 returnMsg.Msg += $ "{err.ErrorMessage}|" ; } } context.Result = new JsonResult(returnMsg); } } } |
之后要使用Action过滤器,使用方式有很多种,如全局,控制器,Action上;这里采用的是全局的形式使用;
现在就加上了,现在如果在过滤器中验证不通过,是不会走到具体的Action方法中的,运行结果如下,按我们定义的消息格式返回了
这样我们就不用在每个Action中都进行判断了;当然,消息内容我们是可以自己定义的,只需要在模型上注解时加上就行,如下:
再看运行结果:
总结
项目中我引入了swagger,方便进行测试,不知道的可以找度娘解答; 也可以直接用其他接口调试工具,不需要swagger,如Postman等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库