.netcore统一参数校验异常处理结果返回功能实现(代码片段)

Archy_Wang_1 Archy_Wang_1     2023-01-15     320

关键词:

我们开发接口时,一般都会涉及到参数校验、异常处理、封装结果返回等处理。如果每个后端开发在参数校验、异常处理等都是各写各的,没有统一处理的话,代码就不优雅,也不容易维护。所以,我们需要统一校验参数,统一异常处理、统一结果返回,让代码更加规范、可读性更强、更容易维护。

统一参数校验

比如我们需要入参为必填,只需要在实体类字段添加  [Required]

    /// <summary>
    ///
    /// </summary>
    public class AdminInputDto
    
        /// <summary>
        /// 账号
        /// </summary>
        [Required]
        public string UserName  get; set; 

        /// <summary>
        /// 密码
        /// </summary>
        [Required]
        public string Password  get; set; 
    

然后再OnActionExecuting 进行验证

  public override void OnActionExecuting(ActionExecutingContext context)
        
            //模型验证
            if (!context.ModelState.IsValid)
            
                throw new CustomException(context.ModelState.Values.First(p => p.Errors.Count > 0).Errors[0].ErrorMessage, ReturnCode.E1000002);
            
            base.OnActionExecuting(context);
        

统一结果返回

统一标准的返回格式。一般一个标准的响应报文对象

code :响应状态码

message :响应结果描述

data:返回的数据

定义一个统一的返回对象模板

    /// <summary>
    /// Service的返回数据
    /// </summary>
    public class ReturnData : ReturnData<object>
    
    
  /// <summary>
    /// Service的返回数据
    /// </summary>
    public class ReturnData<T>
    
        /// <summary>
        /// 返回码
        /// </summary>
        public ReturnCode Code  get; set; 

        /// <summary>
        /// 消息
        /// </summary>
        public string Message  get; set; 

        /// <summary>
        /// 结果数据
        /// </summary>
        public T Data  get; set; 

        /// <summary>
        /// 判断处理是否成功
        /// </summary>
        public bool Success
        
            get  return ReturnCode.E10000 == Code; 
        
    

在控制器返回的时候,进行返回包装

/// <summary>
        /// 处理正常返回的结果对象
        /// </summary>
        /// <param name="context"></param>
        public override void OnActionExecuted(ActionExecutedContext context)
        
            if (context.Result != null)
            
                var serializerSettings = new JsonSerializerSettings
                
                    DateTimeZoneHandling = DateTimeZoneHandling.Local,
                    DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffzz:00",
                    //设置缩进
                    Formatting = Formatting.Indented,
                    //设置json格式为驼峰式
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                ;

                var result = context.Result as ObjectResult;
                JsonResult newresult;
                if (context.Result is ObjectResult)
                
                    newresult = new JsonResult(new ReturnData  Message = "操作成功!", Code = ReturnCode.E10000, Data = result.Value , serializerSettings);
                
                else if (context.Result is EmptyResult)
                
                    newresult = new JsonResult(new ReturnData  Message = "操作成功!", Code = ReturnCode.E10000 , serializerSettings);
                
                else
                
                    throw new Exception($"未经处理的Result类型: context.Result.GetType().Name");
                
                context.Result = newresult;
            
            base.OnActionExecuted(context);
        

统一异常处理

遇到未处理的异常进行统一的封装

/// <summary>
    /// api异常统一处理过滤器
    /// </summary>
    public class ApiExceptionFilterAttribute : ExceptionFilterAttribute
    
        public override void OnException(ExceptionContext context)
        
            context.Result = BuildExceptionResult(context.Exception);
            base.OnException(context);
        

        /// <summary>
        /// 包装处理异常格式
        /// </summary>
        /// <param name="ex"></param>
        /// <returns></returns>
        private JsonResult BuildExceptionResult(Exception ex)
        
            var returnData = new ReturnData();
            var exresult = ex as CustomException;
            var WriteLog = true;
            if (exresult != null)
            
                //异常为自定义的异常
                returnData.Code = exresult.ErrorCode;
                returnData.Message = exresult.Message;
                WriteLog = exresult.WriteLog;
            
            else
            
                //异常为未知异常
                returnData.Code = ReturnCode.E1000001;
                returnData.Message = ex.Message;
            

            //TODO 日志

            var serializerSettings = new JsonSerializerSettings
            
                DateTimeZoneHandling = DateTimeZoneHandling.Local,
                DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffzz:00",
                //设置缩进
                Formatting = Formatting.Indented,
                //设置json格式为驼峰式
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            ;

            return new JsonResult(returnData, serializerSettings);
        
    

.netcore统一参数校验异常处理结果返回功能实现(代码片段)

我们开发接口时,一般都会涉及到参数校验、异常处理、封装结果返回等处理。如果每个后端开发在参数校验、异常处理等都是各写各的,没有统一处理的话,代码就不优雅,也不容易维护。所以,我们需要... 查看详情

.netcore统一参数校验异常处理结果返回功能实现(代码片段)

我们开发接口时,一般都会涉及到参数校验、异常处理、封装结果返回等处理。如果每个后端开发在参数校验、异常处理等都是各写各的,没有统一处理的话,代码就不优雅,也不容易维护。所以,我们需要... 查看详情

自定义参数校验以及统一处理结果集(代码片段)

自定义参数校验以及统一处理结果集1.引入校验组件2.定义统一返回结果3.返回值统一包装处理4.@RestControllerAdvice+ResponseBodyAdvice统一处理5.@RestControllerAdvice+@ExceptionHandler处理6.方法基本参数校验原理7.方法级别的参数... 查看详情

统一异常处理(代码片段)

统一异常处理在项目中,经常会对一些条件之类的参数进行校验,如果有问题,则向前端返回错误信息。之前的项目里,只有在controller层可以返回错误信息,而在service层,只能返回固定的结果,不能说明错误信息。此时可以通... 查看详情

springboot统一参数校验统一异常统一响应,这才是优雅的处理方式!(代码片段)

前言本篇主要要介绍的就是controller层的处理,一个完整的后端请求由4部分组成:接口地址(也就是URL地址)请求方式(一般就是get、set,当然还有put、delete)请求数据(request,有head跟body)响应数据(response)本篇将解决以... 查看详情

瞧瞧人家用springboot写的后端api接口,那叫一个优雅

...解的方式,来进行参数校验,这样代码更加简洁,也方便统一管理。实际上,springboot有个validation的组件,我们可以拿来即用。引入这个包即可:引入包后,参数校验就非常简洁啦,如下:然后在UserParam参数对象中,加入@Validated... 查看详情

hibernate-validator校验参数(统一异常处理)

hibernate-validator一、概述BeanValidation源于JSR-303,而JSR303是JavaEE6中的一项子规范。JSR349、JSR380是其升级版,添加了一些新的特性。Oracle公司传统艺能,一流公司定标准,它们只定义了一些校验注解(Constraint),如@Null@NotNull@Pattern]... 查看详情

商城项目10_jsr303常用注解在项目中如何使用统一处理异常分组校验功能自定义校验注解(代码片段)

...章目录①.JSR303校验概述、注解②.项目中JSR303如何使用③.统一异常处理@ExceptionHandler④.处理错误状态码⑤.分组校验功能(多场景校验)⑥.自定义校验注解①.JSR303校验概述、注解①.JSR是JavaSpecificationRequests的缩写,意思是Java规范... 查看详情

统一异常处理(代码片段)

1统一请求返回的最外层对象日常处理请求时,异常返回结果与正常返回结果格式不一样,不利于前后端的数据交互,如果不处理也不利于编码。封装一个统一请求返回结果最外层对象是一种比较好的设计思想。packagecom.latiny.pojo;... 查看详情

springmvc,springboot统一校验自定义异常全局异常处理(代码片段)

引入jar包<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>写一个DTO用来接收客户端传送的参数@Datapubliccl 查看详情

springmvc,springboot统一校验自定义异常全局异常处理(代码片段)

引入jar包<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>写一个DTO用来接收客户端传送的参数@Datapubliccl 查看详情

异常统一封装处理(代码片段)

(一)异常封装处理类用到的注解    1)@ControllerAdvice    2) @ExceptionHandler (二)异常封装处理类用到的注解    1异常枚举类 packagecom.atguigu.common.exception;/***10:通用*001:参数格式校验**11:商品*12:订单*13:购... 查看详情

springboot统一功能处理(用户登录权限效验-拦截器异常处理数据格式返回)(代码片段)

文章目录1.统一用户登录权限效验1.1最初用户登录权限效验1.2SpringAOP统一用户登录验证1.3Spring拦截器1.4练习:登录拦截器1.5拦截器实现原理1.6统一访问前缀添加2.统一异常处理3.统一数据格式返回3.1统一数据格式返回的实现3.2&... 查看详情

谷粒学院项目总结(代码片段)

...置2.1配置分页插件2.2自动填充2.3代码生成器3.Swagger配置4.统一返回数据格式4.1统一结果返回类4.2统一定义返回码5.统一异常处理5.1创建统一异常处理器5.2自定义异常处理6.统一日志处理6.1配置日志级别6.2Logback日志6.3将错误日志输... 查看详情

通过aop实现rpc统一参数校验&异常捕捉

api rpc 统一参数校验和异常拦截hibernatevalidator工具类publicclassValidatorUtils{privateValidatorUtils(){}privatestaticValidatorvalidator;publicstatic<T>voidvalidate(Tobj){Set<ConstraintViolation& 查看详情

springmvc请求参数异常处理

接着上一篇《springmvc通过异常增强返回给客户端统一格式》讲通过springControllerAdvice对各种异常进行拦截处理,统一格式返回给客户端。接下来我们更精细的讲,通过@ExceptionHandler拦截异常,提示参数客户端哪些参数没有传或参数... 查看详情

springboot2.0统一返回rest风格数据结构与统一异常处理

参考技术A结果: 查看详情

开发规范~参数校验异常异常返回提示切面(代码片段)

...去实现一个功能。本文的内容在于帮助开发人员高效的对参数进行校验。谏言越简单的代码越高效,这个是我上岗遇到的第一个IT师傅说的,现已牢记于心也送给大家,不喜勿喷哦。参数校验高级处理直接编写环切的... 查看详情