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

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

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

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

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

{
    "succeed":true,
    "code": 200,
    "message": "请求成功",
    "data": 
    {
        // 实际的数据内容
    }
}

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

    public class ApiResult
    {
        /// <summary>
        /// 是否成功
        /// </summary>
        public bool isSuccess { get; set; }

        /// <summary>
        /// 状态码
        /// </summary>
        public int code { get; set; }

        /// <summary>
        /// 返回数据集合
        /// </summary>
        public object data { get; set; }

        /// <summary>
        /// 显示信息
        /// </summary>
        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<ApiResponseMiddleware>();
//尽量靠前,放某些后边,测试调试会不进入。

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值