基于过滤器的全局统一返回处理
- 适用版本:NET 6
- 适用项目:
Web Api
- 具体项目:
ASP.NET Core 6
我的解决方案
全局统一返回处理 结构
- 常规API
- 统一返回信息类
IActionFilter
接口实现
常规API
此处Demo,仅使用最少语法演示:
[ApiController]
[Route("api/[controller]")]
public class TreeHolesController : Controller
{
public TreeHolesController()
{
/*-------------Code--------------*/
}
[HttpGet]
public ActionResult<string> Index()
{
return "Hello World";
}
}
默认没有过滤器时,这个接口返回的就是这个字符串,没有任何封装
当下面的过滤器完成后,这个接口就会被过滤器自动封装,不需要额外再写其他的代码。
统一信息返回类
public enum ResultInfoCode
{
[Description("有效操作")]
SUCCESS = 1024,
[Description("操作异常")]
ERROR,
[Description("无效操作")]
FAIL,
[Description("操作警告")]
WARRING
}
public class ResultInfo
{
public ResultInfoCode Code { get; set; }
public string? Title { get; set; }
public string? Message { get; set; }
public string? Url { get; set; }
public Object? Data { get; set; }
public ResultInfo(ResultInfoCode code, string message, string url,Object data)
{
Title = "Tip";
Code = code;
Message = message;
Url = url;
Data = data;
}
}
这里可以有多种实现构造函数,本Demo仅展示最初始的构造。
全局返回过滤器
这里主要用到IActionFilter
接口的OnActionExecuted
方法;定义一个你自己的过滤器继承这个接口,实现它的两个方法。
public void OnActionExecuting(ActionExecutingContext executingContext)
{
HttpRequest obj = executingContext.HttpContext.Request;
Console.WriteLine($"接受请求:[{obj.Method}=>{obj.Path}]");
}
/// <summary>
/// 在 API 请求之后执行
/// </summary>
/// <param name="executedContext">操作完成后的上下文</param>
public void OnActionExecuted(ActionExecutedContext executedContext)
{
HttpRequest item = executedContext.HttpContext.Request;
// 强转位ObjectResult ,这样可以获得接口返回的信息
ObjectResult obj = (ObjectResult)executedContext.Result;
if (executedContext.Canceled)
{
// 是否被其他 Filters 短路
}
else if (executedContext.Exception != null)
{
// 是否存在异常
}
else {
// 此处做一个Demo ,需要后期实现动态绑值,该值类型和接口返回类型相同
string info = obj.Value.ToString();
ResultInfo ts = new (obj.Value!=null?
ResultInfoCode.SUCCESS:ResultInfoCode.ERROR,"ts",item.Path,info);
executedContext.Result = new ObjectResult(ts);
Console.WriteLine($"处理结果:[{((ObjectResult)executedContext.Result).Value}=>{item.Path}]");
}
}
至此,一个简单的全局统一信息(格式)返回就完成了。
这种方式,后期可以通过反射和ActionResult的返回值等方式来进行多态实现。
切记在Program.cs
中添加对过滤器的支持builder.Services.AddControllers(options =>options.Filters.Add<ApplicationFilters>());
常规解决方案(通过开发者自我约束去实现)
全局统一返回处理 结构
- 返回信息类
- 常规API(可继承一个多态实现的返回信息类)
- 多态实现的返回信息类:[可选]
常规API
[ApiController]
[Route("api/[controller]")]
public class TreeHolesController : Controller /*,多态实现的返回信息类*/
{
public TreeHolesController()
{
/*-------------Code--------------*/
}
[HttpGet]
public ActionResult<string> Index()
{
return new TreeInfo(ResultInfoCode.SUCCESS,
"Demo-default","/api/treeholes","Hello World");
}
}
常规方案具有更大的灵活性,但需要开发者在开发过程中,不断的添加和修改。