ASP.NET Core WebApi返回结果统一包装实践记录
简介
在ASP.NET Core的WebApi中,我们经常需要对返回结果进行处理,比如统一进行数据包装,加上状态标识等。本文将对WebApi的结果统一包装进行详细阐述,同时给出两条示例。
实现方式
Step 1:新建WebApi项目
使用Visual Studio或者VS Code等工具创建ASP.NET Core WebApi项目。
Step 2:定义统一返回结果的类
定义一个名为ApiResponse
的类,用于包装返回数据。
public class ApiResponse<TData>
{
public ApiResponse(int statusCode, string errorMessage, TData data)
{
StatusCode = statusCode;
ErrorMessage = errorMessage;
Data = data;
}
public int StatusCode { get; set; }
public string ErrorMessage { get; set; }
public TData Data { get; set; }
}
Step 3:统一返回结果
在WebApi的Controller中,统一使用ApiResponse
类对数据进行包装。其中,ApiResponse
类中的StatusCode
表示请求的状态码,ErrorMessage
表示错误信息,Data
则表示返回的数据。示例代码如下:
[HttpGet]
public async Task<ActionResult<ApiResponse<string>>> Get()
{
var data = await _service.GetDataAsync();
if (string.IsNullOrEmpty(data))
{
return NotFound(new ApiResponse<string>(404, "data not found", null));
}
return Ok(new ApiResponse<string>(200, null, data));
}
Step 4:全局处理返回结果
使用ASP.NET Core中的中间件,在全局统一处理返回结果。示例代码如下:
public class ApiResponseMiddleware
{
private readonly RequestDelegate _next;
public ApiResponseMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
var originalBody = context.Response.Body;
using var memStream = new MemoryStream();
context.Response.Body = memStream;
try
{
await _next(context);
if (context.Response.StatusCode == StatusCodes.Status200OK)
{
memStream.Position = 0;
var responseReader = new StreamReader(memStream);
var responseBody = await responseReader.ReadToEndAsync();
// 将返回数据进行包装
var data = JsonConvert.DeserializeObject(responseBody);
var result = new ApiResponse<object>(context.Response.StatusCode, null, data);
context.Response.ContentType = "application/json";
context.Response.StatusCode = StatusCodes.Status200OK;
await context.Response.WriteAsync(JsonConvert.SerializeObject(result));
}
}
finally
{
context.Response.Body = originalBody;
}
}
}
在Startup.cs
中将中间件添加至管道。示例代码如下:
app.UseMiddleware<ApiResponseMiddleware>();
示例1:返回整形数据
[HttpGet("{id}")]
public async Task<ActionResult<ApiResponse<int>>> GetById(int id)
{
var data = await _service.GetDataByIdAsync(id);
if (data <= 0)
{
return NotFound(new ApiResponse<string>(404, "data not found", null));
}
return Ok(new ApiResponse<int>(200, null, data));
}
示例2:返回列表数据
[HttpGet]
public async Task<ActionResult<ApiResponse<List<string>>>> Get()
{
var data = await _service.GetListAsync();
if (data == null || data.Count == 0)
{
return NotFound(new ApiResponse<string>(404, "data not found", null));
}
return Ok(new ApiResponse<List<string>>(200, null, data));
}
结论
使用ASP.NET Core中的WebApi,对返回数据进行包装,可以统一返回格式,并且便于控制返回的状态。同时使用中间件,对返回结果进行全局处理,可以简化代码的编写,提高开发效率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ASP.NET Core WebApi返回结果统一包装实践记录 - Python技术站