当前位置: 首页 > news >正文

.net6的webapi项目统一封装返回值

/// <summary>
/// 封装工厂后台的返回数据
/// </summary>
public class FactoryResultFilterAttribute : ResultFilterAttribute
{/// <summary>/// 如果只是返回Task的接口,会自动封装成CommonResponse/// </summary>/// <param name="context"></param>/// <param name="next"></param>/// <returns></returns>public override async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next){if (!context.ActionDescriptor.EndpointMetadata.Any(x => x.GetType().Equals(typeof(NoResultFilterAttribute)))){if (context.Result.GetType() == typeof(EmptyResult)){var res = new CommonResponse();context.Result = new JsonResult(res){ContentType = "application/json",StatusCode = 200,};}else if ((context.HttpContext.Request.Method.Equals("GET", StringComparison.OrdinalIgnoreCase) || context.HttpContext.Request.Method.Equals("POST", StringComparison.OrdinalIgnoreCase)) && context.Result is ObjectResult){var result = (ObjectResult)context.Result;var res = new CommonResponse<Object>{Data = result.Value,};context.Result = new JsonResult(res){ContentType = "application/json",StatusCode = 200,};}}await next.Invoke();}}

1. 统一包装返回参数,使用过滤器ResultFilterAttribute来实现,OnResultExecutionAsync中可以处理所有Get和Post类型接口返回的数据,用CommonResponse类包装一下。

CommonResponse类主要用来返回Code(200表示成功)和Message(访问失败的原因)

2. 这里配合ExceptionFilterAttribute一起用,用来捕捉错误BusinessException,这样业务代码出现错误后,直接throw new BusinessException("金额不能为0"),就会被过滤器自动捕捉并封装成CommonResponse返回给前端,方便前端统一处理。

/// <summary>
/// 业务类型错误
/// </summary>
public class BusinessException : Exception
{public BusinessException() : base("数据不存在"){}public BusinessException(string message) : base(message){}
}
/// <summary>
/// 通用的异常处理
/// </summary>
public class FactoryExceptionFilterAttribute : ExceptionFilterAttribute
{private readonly ILogger<FactoryExceptionFilterAttribute> _logger;/// <summary>/// /// </summary>/// <param name="logger"></param>public FactoryExceptionFilterAttribute(ILogger<FactoryExceptionFilterAttribute> logger){_logger = logger;}/// <summary>/// 通用api接口异常处理/// </summary>/// <param name="context"></param>/// <returns></returns>public override Task OnExceptionAsync(ExceptionContext context){if (!context.ExceptionHandled){Exception exception = context.Exception;if (exception is BusinessException){context.Result = new JsonResult(new CommonResponse(exception.Message));}else if (exception is ValidationException){ValidationException? e = exception as ValidationException;context.Result = new JsonResult(new CommonResponse(e?.Errors.FirstOrDefault()?.ErrorMessage ?? ""));}else{var res = new CommonResponse{Code = ResCode.ServerError,Message = "请求错误"};exception.Log(context.HttpContext);_logger.LogError(exception.Message);context.Result = new JsonResult(res);}}context.ExceptionHandled = true;return Task.CompletedTask;}
}

http://www.dtcms.com/a/306513.html

相关文章:

  • 剧本杀系统 App 开发:科技赋能,重塑剧本杀游戏体验
  • 光伏气象监测系统:当阳光遇见科技
  • Javascript 基础总结
  • 做题笔记:某大讯飞真题28道
  • 浅拷贝和深拷贝
  • uni-app,uni.navigateTo
  • 【LangChain4j 详解】Java生态大语言模型框架设计哲学与架构原理
  • Node.js以及异步编程
  • vue模块化导入
  • 网络安全学习第16集(cdn知识点)
  • Android调用python库和方法的实现
  • 开源项目:排序算法的多种实现方式
  • DAY15-指针(3)
  • 解决:React Native 中常见的 状态栏遮挡内容
  • python 中 TypeError: self类型对象传入错误解决办法
  • 在职申硕,怎么选适合自己的学科专业呢?
  • 计算机网络1-3:三种交换方式
  • sed编程入门
  • Android RTMP推送|轻量级RTSP服务同屏实践:屏幕+音频+录像全链路落地方案
  • 本地 docker 部署 HAR包分析工具 harviewer
  • 2025年7月技术问答第5期
  • MySQL: with as与with RECURSIVE如何混合使用?
  • 【算法】十大排序算法超深度解析,从数学原理到汇编级优化,涵盖 15个核心维度
  • 专题:2025机器人产业技术图谱与商业化指南|附130+份报告PDF、数据汇总下载
  • C++实战:抖音级视频应用开发精髓
  • LazyLLM教程 | 第2讲:10分钟上手一个最小可用RAG系统
  • [极客时间]LangChain 实战课 -----|(11) 记忆:通过Memory记住客户上次买花时的对话细节
  • macOS 设置 Claude Code
  • 02 NameServer是如何管理Broker集群的
  • 【STM32-HAL】 SPI通信与Flash数据写入实战