统一接口的返回格式是为了方便开发的数据对接。
在现如今前后端分离的趋势下,需要对接各种类型的数据
所以,我们需要一个标准的数据格式。
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哈哈~
如果是两套不同的开源 项目,还是后端改方便吧。
好了,今天的这个分享就到这里了,感兴趣的可以点赞、收藏、加关注~