最近搭項目框架,為了便於接口返回值統一規范,做了一些配置,使得無論接口方法返回值是什么類型,都統一做了攔截,具體實現方式為:
首先需要幾個過濾類:異常處理返回類,正常調用統一返回類,忽略返回格式類,
對應類代碼如下:
異常處理返回類

using System; using System.Linq; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Filters; namespace S2_Xxxx_XxxNetApi { /// <summary> /// Api action統一處理過濾器 /// 處理正常返回值 /// </summary> public class ApiResultFilterAttribute : Attribute, IActionFilter { /// <summary> /// 執行方法體之后 /// 返回結果為JsonResult的請求進行Result包裝 /// </summary> /// <param name="context"></param> public void OnActionExecuted(ActionExecutedContext context) { //特殊處理:對有ApiIgnoreAttribute標簽的,不進行返回結果包裝,原樣輸出 var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor; if (controllerActionDescriptor != null) { var isDefined = controllerActionDescriptor.EndpointMetadata.Any(a => a.GetType().Equals(typeof(ApiIgnoreAttribute))); if (isDefined) { return; } } // 返回結果為JsonResult的請求進行Result包裝 if (context.Result != null) { if (context.Result is ObjectResult) { var result = context.Result as ObjectResult; context.Result = new JsonResult(new { code = 200, msg = "success", data = result.Value }); } else if (context.Result is EmptyResult) { context.Result = new JsonResult(new { code = 200, msg = "success", data = new { } }); } else if (context.Result is ContentResult) { var result = context.Result as ContentResult; context.Result = new JsonResult(new { code = result.StatusCode, msg = result.Content }); } else { throw new Exception($"未經處理的Result類型:{ context.Result.GetType().Name}"); } } } /// <summary> /// 執行方法體之前 /// </summary> /// <param name="context"></param> public void OnActionExecuting(ActionExecutingContext context) { //不做修改 } } }
正常調用統一返回類

using System; using System.Linq; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Filters; namespace S2_Xxxx_XxxNetApi { /// <summary> /// Api action統一處理過濾器 /// 處理正常返回值 /// </summary> public class ApiResultFilterAttribute : Attribute, IActionFilter { /// <summary> /// 執行方法體之后 /// 返回結果為JsonResult的請求進行Result包裝 /// </summary> /// <param name="context"></param> public void OnActionExecuted(ActionExecutedContext context) { //特殊處理:對有ApiIgnoreAttribute標簽的,不進行返回結果包裝,原樣輸出 var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor; if (controllerActionDescriptor != null) { var isDefined = controllerActionDescriptor.EndpointMetadata.Any(a => a.GetType().Equals(typeof(ApiIgnoreAttribute))); if (isDefined) { return; } } // 返回結果為JsonResult的請求進行Result包裝 if (context.Result != null) { if (context.Result is ObjectResult) { var result = context.Result as ObjectResult; context.Result = new JsonResult(new { code = 200, msg = "success", data = result.Value }); } else if (context.Result is EmptyResult) { context.Result = new JsonResult(new { code = 200, msg = "success", data = new { } }); } else if (context.Result is ContentResult) { var result = context.Result as ContentResult; context.Result = new JsonResult(new { code = result.StatusCode, msg = result.Content }); } else { throw new Exception($"未經處理的Result類型:{ context.Result.GetType().Name}"); } } } /// <summary> /// 執行方法體之前 /// </summary> /// <param name="context"></param> public void OnActionExecuting(ActionExecutingContext context) { //不做修改 } } }
忽略返回格式類(這個類根據實際需求調整不需要攔截返回的類型)

using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace S2_Xxxx_XxxNetApi { /// <summary> /// 使用該標簽,對結果原樣輸出,不做包裝 /// </summary> public class ApiIgnoreAttribute : Attribute { } }
然后在程序啟動類注入相關方法

public void ConfigureServices(IServiceCollection services) { //注冊過濾器 services.AddSingleton<ApiResultFilterAttribute>(); services.AddSingleton<ApiExceptionFilterAttribute>(); services.AddMvc( config => { config.EnableEndpointRouting = false; config.Filters.AddService(typeof(ApiResultFilterAttribute)); config.Filters.AddService(typeof(ApiExceptionFilterAttribute)); }) .SetCompatibilityVersion(CompatibilityVersion.Version_3_0) .AddNewtonsoftJson(); }
做對應測試就可返回對應的類型
這種返回值就比較統一規范,提高了前后端的協作;