统一接口的返回格式是为了方便开发的数据对接。
在现如今前后端分离的趋势下,需要对接各种类型的数据
所以,我们需要一个标准的数据格式。
1、定义数据格式:例如下边就是一个常见的格式
- {
- "succeed":true,
- "code": 200,
- "message": "请求成功",
- "data":
- {
- // 实际的数据内容
- }
- }
2、定义类(ps:这里的类字段名与上边的返回不一样)
- public class ApiResult
- {
- ///
- /// 是否成功
- ///
- public bool isSuccess { get; set; }
-
- ///
- /// 状态码
- ///
- public int code { get; set; }
-
- ///
- /// 返回数据集合
- ///
- public object data { get; set; }
-
- ///
- /// 显示信息
- ///
- public string msg { get; set; }
-
- }
3、
3.1、方法一:使用IActionFilter。
具体也可以看官方的文档:
https://learn.microsoft.com/zh-cn/aspnet/core/mvc/controllers/filters?view=aspnetcore-8.0
- using Microsoft.AspNetCore.Mvc.Filters;
- using Microsoft.AspNetCore.Mvc;
-
- public class GlobalActionFilter : IActionFilter
- {
- public void OnActionExecuting(ActionExecutingContext context)
- {
- // Do something before the action executes.
- }
-
- public void OnActionExecuted(ActionExecutedContext context)
- {
- // Do something after the action executes.
-
-
- var result = context.Result as Microsoft.AspNetCore.Mvc.ObjectResult;
-
- try
- {
- context.Result = new OkObjectResult(new ApiResult
- {
- isSuccess= true,
- code= 200,
- errors = null,
- data = result
- });
- }
- catch (Exception ex)
- {
- }
-
- }
- }
3.2、方法二:创建中间件:
- //1、创建类
- public class ApiResponseMiddleware
- {
- private readonly RequestDelegate _next;
-
- public ApiResponseMiddleware(RequestDelegate next)
- {
- _next = next;
- }
-
- public async Task InvokeAsync(HttpContext context)
- {
- var originalResponseBody = context.Response.Body;
- try
- {
- using var memStream = new MemoryStream();
- context.Response.Body = memStream;
-
- await _next(context);
-
- memStream.Seek(0, SeekOrigin.Begin);
- var responseStream = memStream.ToArray();
- var responseContent = Encoding.UTF8.GetString(responseStream);
-
- var resultObject = Newtonsoft.Json.JsonConvert.DeserializeObject<object>(responseContent);
-
- var apiResponse = new ApiResult
- {
- isSuccess= true,
- code= context.Response.StatusCode,
- msg= "Success",
- data = resultObject
- };
-
- context.Response.ContentType = "application/json";
- context.Response.Body = originalResponseBody;
-
- var json = Newtonsoft.Json.JsonConvert.SerializeObject(apiResponse); ;
- await context.Response.WriteAsync(json);
- }
- finally
- {
- context.Response.Body = originalResponseBody;
- }
- }
- }
- //2、注入服务:
- app.UseMiddleware
(); - //尽量靠前,放某些后边,测试调试会不进入。
3.3、其他。上边两种方式是不建议一起使用的。
个人目前测试同时使用的话,方法一的执行会嵌入到方法二中
大概就是方法一格式了一次后,到方法二后再格式一次。
4、其他:
4.1、按方法一的官方文档,还可以拓展成特性的形式,对需要的加格式。(也可以取反,比如设置那些不需要格式化,其他默认都带。)
4.2、另外在:
https://learn.microsoft.com/zh-cn/aspnet/core/mvc/controllers/filters?view=aspnetcore-8.0
还有其他的过滤器,例如:IResultFilter。
可以拓展看看这三个的执行顺序,考虑服务注册的顺序,看看实际的执行效果如何。
4.3、我们如果在Action中就统一用ApiResult
如果是两套不同的开源 项目,还是后端改方便吧。
好了,今天的这个分享就到这里了,感兴趣的可以点赞、收藏、加关注~