.Net Core Web Api使用模型验证验证参数合法性
- 在接口开发过程中免不了要去验证参数的合法性,模型验证就是帮助我们去验证参数的合法性,我们可以在需要验证的model属性上加上Data Annotations特性后就会自动帮我们在action前去验证输入数据的合法性。
1.定义一个Person类
public class PersonDto
{
public string Name { get; set; }
public string Phone { get; set; }
public int Age { get; set; }
}
Person类有三个属性,姓名,电话,年纪。
2.创建一个接口并以Person作为input参数并且返回input对象
public PersonDto Demo(PersonDto input)
{
var str = string.Empty;
PersonDto dto = new PersonDto
{
Name = input.Name,
Age=input.Age,
Phone=input.Phone,
};
return dto;
}
3.用postman来调用这个接口

很明显我传入的参数是不合法的,但是接口依旧执行了。 那怎么去验证参数的合法性呢?在接口里面写if吗?这时候模型验证就发挥作用啦。
4.修改之前的Person类,引入using System.ComponentModel.DataAnnotations;
public class PersonDto
{
[Required(ErrorMessage = , ErrorMessage = , ErrorMessage = "名字太短")]
[ RegularExpression(@"^[\u4e00-\u9fa5]+$", ErrorMessage = "姓名必须是中文")]
public string Name { get; set; }
[Required(ErrorMessage = "手机号码不能为空"), RegularExpression(@"^\+?\d{0,4}?[1][3-8]\d{9}$", ErrorMessage = "手机号码格式错误")]
public string Phone { get; set; }
[Range(, , ErrorMessage = "年纪必须在0-99之间")]
public int Age { get; set; }
}
在次调用这个接口。

如果参数参数的不合法会直接400且会根据定义的提示去提示前端参数哪里不合法。但是很多小伙伴的返回值都是通用的,怎么把这些提示放到自己的通用返回值里面呢?
5.定义一个通用的返回值
public class ResponseDto
{/// <summary>
/// 详细错误信息
/// </summary>
public string message { get; set; }
/// <summary>
/// 具体业务参数
/// </summary>
public object data { get; set; }
}
6.定义一个CustomResultFilter
public class CustomResultFilter : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext context)
{
if (!context.ModelState.IsValid)
{
ResponseDto result = new ResponseDto();
foreach (var item in context.ModelState.Values)
{
foreach (var error in item.Errors)
{
result.message += error.ErrorMessage + ",";
result.data = "{}";
}
}
result.message = result.message.TrimEnd(',');
context.Result = new JsonResult(result);
}
else
{
var result = context.Result as ObjectResult ?? null;
context.Result = new OkObjectResult(new ResponseDto
{
message = "成功",
data = result == null ? "{}" : result.Value
});
base.OnResultExecuting(context);
}
}
public override void OnActionExecuting(ActionExecutingContext context)
{
}
使用ModelState.IsValid来判断模型验证是否通过。
7.配置过滤器
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.Filters.Add(typeof(CustomResultFilter));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new Info
{
Title = " API",
Version = "v1",
Description = "RESTful API",
TermsOfService = " Service",
Contact = new Contact { Name = "", Email = "", Url = "" }
});
});
}
8.测试

模型验证通过

.Net Core Web Api使用模型验证验证参数合法性的更多相关文章
- 使用JWT创建安全的ASP.NET Core Web API
在本文中,你将学习如何在ASP.NET Core Web API中使用JWT身份验证.我将在编写代码时逐步简化.我们将构建两个终结点,一个用于客户登录,另一个用于获取客户订单.这些api将连接到在本地 ...
- ASP.NET Core Web API + Angular 仿B站(三)后台配置 JWT 的基于 token 的验证
前言: 本系列文章主要为对所学 Angular 框架的一次微小的实践,对 b站页面作简单的模仿. 本系列文章主要参考资料: 微软文档: https://docs.microsoft.com/zh-cn ...
- .net core web API使用Identity Server4 身份验证
一.新建一个.net core web项目作为Identity server 4验证服务. 选择更改身份验证,然后再弹出的对话框里面选择个人用户账户. nuget 安装Identity server相 ...
- ASP.NET Core Web API中带有刷新令牌的JWT身份验证流程
ASP.NET Core Web API中带有刷新令牌的JWT身份验证流程 翻译自:地址 在今年年初,我整理了有关将JWT身份验证与ASP.NET Core Web API和Angular一起使用的详 ...
- .NET Core WEB API中接口参数的模型绑定的理解
在.NET Core WEB API中参数的模型绑定方式有以下表格中的几种: 微软官方文档说明地址:https://docs.microsoft.com/zh-cn/aspnet/core/web-a ...
- ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理
在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很 ...
- NET Core Web API下事件驱动型架构CQRS架构中聚合与聚合根的实现
NET Core Web API下事件驱动型架构在前面两篇文章中,我详细介绍了基本事件系统的实现,包括事件派发和订阅.通过事件处理器执行上下文来解决对象生命周期问题,以及一个基于RabbitMQ的事件 ...
- ASP.NET Core Web API 最佳实践指南
原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 介绍 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但是,你难 ...
- [转]ASP.NET Core Web API 最佳实践指南
原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 转自 介绍# 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但 ...
随机推荐
- 【IOS开发—视图控制器】
一.UIViewController 视图控制器是UIViewController类或者其子类对象,每个视图控制器都负责管理一个视图层次结构.在UIViewController中有一个重要的UIVie ...
- 用js和css实现选项卡效果+jq(2019-10-09)
1效果图: 2代码: html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...
- 深入理解java继承从“我爸是李刚”讲起
目录 1.继承的概述 2.关于继承之后的成员变量 3.关于继承之后的成员方法 4.关于继承之后的构造方法 5.关于继承的多态性支持的例子 6.super与this的用法 前言 本文主要多方面讲解jav ...
- VS2019打包WPF安装程序最新教程
VS2019打包WPF安装程序最新教程,使用Visual Studio 2019开发的WPF程序如果想要打包为安装程序,除了在VS2019找到WPF项目类库直接右键发布之外,更常用的还是将其打包为ex ...
- JDBD连接MySQL中的驱动与时区问题
1.在进行jdbc与mysql连接的时候应注意,加载驱动的方式根据MySQL版本内容来说 有变化 5.7版本之前: String driver= "com.mysql.jdbc.Driver ...
- 深入理解 PHP 的 7 个预定义接口
深入理解预定义接口 场景:平常工作中写的都是业务模块,很少会去实现这样的接口,但是在框架里面用的倒是很多. 1. Traversable(遍历)接口 该接口不能被类直接实现,如果直接写了一个普通类 ...
- Feign 调用丢失Header的解决方案
问题 在 Spring Cloud 中 微服务之间的调用会用到Feign,但是在默认情况下,Feign 调用远程服务存在Header请求头丢失问题. 解决方案 首先需要写一个 Feign请求拦截器,通 ...
- oracle使用parallel并行,多线程查询
insert into tmp (select /*parallel (a, 4)*/ * from plsuer.as_cdrindex_info_h partition(P_20170430) w ...
- uniapp打包Android APP
1.uniAPP 将项目打包成,打包成功后格式如下 2.下载相关工具 Android studio(打包成app的工具) 和Hbuilder官方SDK,安装解压响应工具 3. 用 Android st ...
- [ch02-02] 非线性反向传播
系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力. 2.2 非线性反向传播 2.2.1 提出问题 在上面的线 ...