• 【个人博客搭建】(24)统一api接口返回格式


    统一接口的返回格式是为了方便开发的数据对接。

    在现如今前后端分离的趋势下,需要对接各种类型的数据

    所以,我们需要一个标准的数据格式

    1、定义数据格式:例如下边就是一个常见的格式

    1. {
    2. "succeed":true,
    3. "code": 200,
    4. "message": "请求成功",
    5. "data":
    6. {
    7. // 实际的数据内容
    8. }
    9. }

     2、定义类(ps:这里的类字段名与上边的返回不一样)

    1. public class ApiResult
    2. {
    3. ///
    4. /// 是否成功
    5. ///
    6. public bool isSuccess { get; set; }
    7. ///
    8. /// 状态码
    9. ///
    10. public int code { get; set; }
    11. ///
    12. /// 返回数据集合
    13. ///
    14. public object data { get; set; }
    15. ///
    16. /// 显示信息
    17. ///
    18. public string msg { get; set; }
    19. }

    3、

            3.1、方法一:使用IActionFilter。

    具体也可以看官方的文档:
        https://learn.microsoft.com/zh-cn/aspnet/core/mvc/controllers/filters?view=aspnetcore-8.0

    1. using Microsoft.AspNetCore.Mvc.Filters;
    2. using Microsoft.AspNetCore.Mvc;
    3. public class GlobalActionFilter : IActionFilter
    4. {
    5. public void OnActionExecuting(ActionExecutingContext context)
    6. {
    7. // Do something before the action executes.
    8. }
    9. public void OnActionExecuted(ActionExecutedContext context)
    10. {
    11. // Do something after the action executes.
    12. var result = context.Result as Microsoft.AspNetCore.Mvc.ObjectResult;
    13. try
    14. {
    15. context.Result = new OkObjectResult(new ApiResult
    16. {
    17. isSuccess= true,
    18. code= 200,
    19. errors = null,
    20. data = result
    21. });
    22. }
    23. catch (Exception ex)
    24. {
    25. }
    26. }
    27. }

            3.2、方法二:创建中间件:

    1. //1、创建类
    2. public class ApiResponseMiddleware
    3. {
    4. private readonly RequestDelegate _next;
    5. public ApiResponseMiddleware(RequestDelegate next)
    6. {
    7. _next = next;
    8. }
    9. public async Task InvokeAsync(HttpContext context)
    10. {
    11. var originalResponseBody = context.Response.Body;
    12. try
    13. {
    14. using var memStream = new MemoryStream();
    15. context.Response.Body = memStream;
    16. await _next(context);
    17. memStream.Seek(0, SeekOrigin.Begin);
    18. var responseStream = memStream.ToArray();
    19. var responseContent = Encoding.UTF8.GetString(responseStream);
    20. var resultObject = Newtonsoft.Json.JsonConvert.DeserializeObject<object>(responseContent);
    21. var apiResponse = new ApiResult
    22. {
    23. isSuccess= true,
    24. code= context.Response.StatusCode,
    25. msg= "Success",
    26. data = resultObject
    27. };
    28. context.Response.ContentType = "application/json";
    29. context.Response.Body = originalResponseBody;
    30. var json = Newtonsoft.Json.JsonConvert.SerializeObject(apiResponse); ;
    31. await context.Response.WriteAsync(json);
    32. }
    33. finally
    34. {
    35. context.Response.Body = originalResponseBody;
    36. }
    37. }
    38. }
    1. //2、注入服务:
    2. app.UseMiddleware();
    3. //尽量靠前,放某些后边,测试调试会不进入。

            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作为格式,但是前端的字段名不同,也可以用改方式进行字段转化。或者让前端改?O(∩_∩)O哈哈~

    如果是两套不同的开源 项目,还是后端改方便吧。

    好了,今天的这个分享就到这里了,感兴趣的可以点赞、收藏、加关注~

  • 相关阅读:
    go语言unsafe.Pointer与uintptr
    你知道什么是Oracle嘛
    【单片机毕业设计选题24039】-基于单片机的太阳能储能智能恒温外卖柜设计
    docker 本地保存镜像方法--docker export 和docker save 使用介绍
    linux的ls命令
    异步复位的串联T触发器
    openGauss学习笔记-127 openGauss 数据库管理-设置账本数据库-修复账本数据库
    依托数据、平台、知识增强等优势 夸克大模型大幅降低问答幻觉率
    LeetCode199. Binary Tree Right Side View
    Java——Switch的使用方法
  • 原文地址:https://blog.csdn.net/qq_44471040/article/details/139653999