首页 > 编程语言 >手把手教你AspNetCore WebApi:数据验证

手把手教你AspNetCore WebApi:数据验证

时间:2023-06-05 22:07:55浏览次数:54  
标签:WebApi opt errors 验证 手把手 AspNetCore context new public

前言

小明最近又遇到麻烦了,小红希望对接接口传送的数据进行验证,既然是小红要求,那小明说什么都得满足呀,这还不简单嘛。

传统验证

[HttpPost]
public async Task<ActionResult<Todo>> PostTodo(Todo todo)
{
    if (string.IsNullOrEmpty(todo.Name))
    {
        return Ok("名称不能为空");
    }
    context.Todo.Add(todo);
    await context.SaveChangesAsync();

    return CreatedAtAction("GetTodo", new { id = todo.Id }, todo);
}

小明写着写着发现这样写,很多接口相同得地方都要写,使得代码比较臃肿。

使用模型验证

在参数模型上打上注解

namespace App001.Models
{
    /// <summary>
    /// 待办事项
    /// </summary>
    public class Todo
    {
        /// <summary>
        /// ID
        /// </summary>
        public Guid Id { get; set; }
        /// <summary>
        /// 名称
        /// </summary>
        [Required(ErrorMessage = "名称不能为空")]
        public string Name { get; set; }
    }
}

Postman测试Name传值未空时,则返回:

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "|df184e36-4e11844dfd38a626.",
    "errors": {
        "Name": [
            "名称不能为空"
        ]
    }
}

注意Web API 控制器具有 [ApiController] 特性,则它们不必检查ModelState.IsValid。在此情况下,如果模型状态无效,将返回包含错误详细信息的自动 HTTP 400 响应。

内置特性

  • [CreditCard]:验证属性是否具有信用卡格式。
  • [Compare]:验证模型中的两个属性是否匹配。
  • [EmailAddress]:验证属性是否具有电子邮件格式。
  • [Phone]:验证属性是否具有电话号码格式。
  • [Range]:验证属性值是否在指定的范围内。
  • [RegularExpression]:验证属性值是否与指定的正则表达式匹配。
  • [Required]:验证字段是否不为 null。
  • [StringLength]:验证字符串属性值是否不超过指定长度限制。
  • [Url]:验证属性是否具有 URL 格式。
  • [Remote]:通过在服务器上调用操作方法来验证客户端上的输入。

Error messages

通过验证特性可以指定要为无效输入显示的错误消息。 例如:

[Required(ErrorMessage = "名称不能为空")]

使用自定义返回消息格式

有两种方式:

  1. 使用自定义过滤器
  2. 使用默认模型验证,需要在控制器上面加上【ApiController】。

使用自定义过滤器

首先,创建ModelValidateActionFilterAttribute过滤器。

public class ModelValidateActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            //获取验证失败的模型字段
            var errors = context.ModelState
                .Where(e => e.Value.Errors.Count > 0)
                .Select(e => e.Value.Errors.First().ErrorMessage)
                .ToList();

            var str = string.Join("|", errors);

            //设置返回内容
            var result = new
            {
                Code = 10000,
                Msg = "未通过数据验证。",
                FullMsg = str
            };

            context.Result = new BadRequestObjectResult(result);
        }

    }
}

然后,Startup.ConfigureServices将过滤器添加到控制器中并关闭默认模型验证,另外我们还添加了AddNewtonsoftJson。

//关闭默认模型验证
services.Configure<ApiBehaviorOptions>(opt => opt.SuppressModelStateInvalidFilter = true);
services.AddControllers(opt =>
{
    //添加过滤器
    opt.Filters.Add(typeof(ModelValidateActionFilterAttribute));
}).AddNewtonsoftJson(opt =>
{
    //json字符串大小写原样输出
    opt.SerializerSettings.ContractResolver = new DefaultContractResolver();
});

最后,我们看一下返回效果:

{
    "Code": 10000,
    "Msg": "未通过数据验证。",
    "FullMsg": "名称不能为空。"
}

使用默认模型验证

services.Configure<ApiBehaviorOptions>(opt =>
{
    opt.InvalidModelStateResponseFactory = actionContext =>
    {
        //获取验证失败的模型字段 
        var errors = actionContext.ModelState
            .Where(e => e.Value.Errors.Count > 0)
            .Select(e => e.Value.Errors.First().ErrorMessage)
            .ToList();

        var str = string.Join("|", errors);

        //设置返回内容
        var result = new
        {
            Code = 10000,
            Msg = "未通过数据验证。",
            FullMsg = str
        };

        return new BadRequestObjectResult(result);
    };
});

小结

目前为止,小明把数据验证也搞定了,是不是so easy!



标签:WebApi,opt,errors,验证,手把手,AspNetCore,context,new,public
From: https://blog.51cto.com/u_4018548/6419722

相关文章

  • 手把手教你AspNetCore WebApi:Serilog(日志)
    前言小明目前已经把“待办事项”功能实现了,API文档也搞定了,但是马老板说过,绝对不能让没有任何监控的项目上线的。Serilog是什么?在.NET使用日志框架第一时间会想到NLog或是Log4Net,Serilog是这几年快速崛起的Log框架之一,Serilog是以Structuredlogging为基础进行设计,透过loggingAP......
  • 手把手教你AspNetCore WebApi:缓存(MemoryCache和Redis)
    前言这几天小明又有烦恼了,系统上线一段时间后,系统性能出现了问题,马老板很生气,叫小明一定要解决这个问题。性能问题一般用什么来解决呢?小明第一时间想到了缓存。什么是缓存缓存是实际工作中非常常用的一种提高性能的方法。缓存可以减少生成内容所需的工作,从而显著提高应用程序的性能......
  • 手把手教你AspNetCore WebApi:增删改查
    前言小明已经创建与运行了WebApi项目,了解项目结构有哪些组成,并学会了怎么发布到IIS。基础已经建好,从现在开始要真正实现待办事项的功能了。新建表CREATETABLE[dbo].[Todo]( [Id][uniqueidentifier]NOTNULL, [Name][nvarchar](100)NULL,CONSTRAINT[PK_Todo]PRIMARYKEY......
  • 手把手教你AspNetCore WebApi:认证与授权
    前言这几天小明又有烦恼了,之前给小红的接口没有做认证授权,直接裸奔在线上,被马老板发现后狠狠的骂了一顿,赶紧让小明把授权加上。赶紧Baidu一下,发现大家都在用JWT认证授权,这个倒是挺适合自己的。什么是TokenToken是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后......
  • 手把手实践丨基于STM32+NBIOT+华为云IOT设计智能井盖
    摘要:本文介绍基于STM32微控制器、BC26NBIOT模组和华为云IOT平台,实现了一款智能井盖系统。本文分享自华为云社区《基于STM32+NBIOT+华为云IOT设计的智能井盖》,作者:DS小龙哥。一、概述智能井盖是一种通过物联网技术实现对井盖状态监测和管理的设备。当前介绍基于STM32微控制器,B......
  • 手把手教你腾讯云搭建RUOYI系统
    手把手教你腾讯云搭建RUOYI系统前置准备腾讯云配置1服务器准备1.1腾讯云购买地址:1.2配置开放端口2软件安装2.1MySQL在线安装2.2Redis安装2.3ngnix安装2.4jdk安装2.5maven3软件运行3.1打包java3.1打包vue4成功常用命令汇总问题汇总如果问题还是解决不了请联系我......
  • Python|通过FastAPI开发一个快速的WebAPI项目
    前言Python如此受欢迎的众多原因之一是Python有大量成熟和稳定的库可供选择:网页开发有:Django和Flask,提供了很好的网络开发体验和大量的有用文档机器学习有:scikit-learn、Keras等,提供了丰富的机器学习的包和数据处理和可视化工具。FastAPI是一个快速、轻量级的现代A......
  • 手把手实现springboot整合flowable、附源码-视频教程
    手把手实现springboot整合flowable、附源码-视频教程[toc]视频教程点击:https://www.bilibili.com/video/BV1fa411j7Q5/插件安装BPMN绘图可视化工具>FlowableBPMNvisualizer导入依赖<dependency><groupid>org.springframework.boot</groupid><artifact......
  • .net 温故知新【11】:Asp.Net Core WebAPI 入门使用及介绍
    在Asp.NetCore上面由于现在前后端分离已经是趋势,所以asp.netcoreMVC用的没有那么多,主要以WebApi作为学习目标。一、创建一个WebApi项目我使用的是VS2022,.Net7版本。在创建界面有几项配置:配置Https启用Docker使用控制器启用OpenAPI支持不使用顶级语句其中配置Ht......
  • 记录--手把手教你Vue+ECharts+高德地图API实现天气预报数据可视化
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言所谓数据可视化,我们可以理解为从宏观角度来看一眼就能看出来整个数据的占比,走向。对于数据可视化,很多互联网公司是很看重这一块的,包括大厂;就比如阿里的淘宝,双十一的时候往往就需要将消费者的一些数据通过图的......