ASP.NET Core WebApi 是一种快速构建 Web API 的方式,但返回的数据格式需要满足前端的要求。如果每个 API 都需要编写返回数据格式的代码,则会产生重复且低效的工作。因此,我们可以使用统一格式参数,将 Web API 返回的数据包装成一个统一的格式,方便前端处理。
下面是实现 ASP.NET Core WebApi 返回统一格式参数的完整攻略:
使用中间件
使用中间件是实现统一格式参数的一种方法。在 Startup.cs
文件中,我们可以编写一个中间件,将 API 返回的数据包装成指定格式。以下是示例代码:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.Use(async (context, next) =>
{
var response = context.Response;
// 存储原始的响应主体,稍后可以使用它来分析响应
var originalBodyStream = response.Body;
// 替换为我们的流
using (var responseBody = new MemoryStream())
{
response.Body = responseBody;
await next();
if (response.StatusCode == 200)
{
var body = await GetResponseBody(response);
var result = new ApiResponse(200, "成功", body);
await response.WriteAsync(result.ToString(), Encoding.UTF8);
}
response.Body = originalBodyStream;
}
});
}
如上代码所示,我们使用了 Lambda 表达式编写了一个中间件。该中间件被注册为应用程序中的全局中间件。第一件事,我们用 MemoryStream
替换了响应的正文(response.Body
)。然后,我们继续处理请求,等到控制器返回响应时,我们在其他流的顶部添加了一些元数据。然后,我们检查响应状态码是否为 200,如果是,则创建一个新的 ApiResponse
格式,并使用它替换为原始的响应体。
确保该 ApiResponse
包含下列属性:
status
:状态码(例如 200)message
:描述状态消息的字符串data
:包含应用程序特定数据的任何对象
编写统一的返回值类型
另外一种方法是通过编写统一的返回值类型,将 Web API 的返回数据包装成统一的格式。以下是示例代码:
public class ApiResponse<T>
{
public int status { get; set; }
public string message { get; set; }
public T data { get; set; }
public ApiResponse(int status, string message, T data)
{
this.status = status;
this.message = message;
this.data = data;
}
}
如上代码所示,我们定义了一个包含 status
、message
和 data
属性的泛型类 ApiResponse<T>
,作为统一的返回值类型。其中,status
表示状态码(例如 200),message
表示描述状态消息的字符串,data
表示包含应用程序特定数据的任何对象。我们构造函数用来初始化这些属性。
接下来,我们可以在控制器中修改返回值类型,将它们包装成 ApiResponse
类型。以下是示例代码:
public class UserController : Controller
{
private readonly IUserService _userService;
public UserController(IUserService userService)
{
_userService = userService;
}
[HttpGet]
public async Task<ApiResponse<List<User>>> GetUsersAsync()
{
var users = await _userService.GetUsersAsync();
return new ApiResponse<List<User>>(200, "成功", users);
}
[HttpGet("{id}")]
public async Task<ApiResponse<User>> GetUserAsync(int id)
{
var user = await _userService.GetUserAsync(id);
return new ApiResponse<User>(200, "成功", user);
}
}
如上代码所示,我们在控制器的返回值类型前加上了 ApiResponse
类型。在方法中,我们使用统一的响应格式创建了一个 ApiResponse
对象进行包装。这样做可以消除编写重复代码的需要。
以上就是完整攻略,通过使用中间件或编写统一的返回值类型,可以方便地包装 Web API 返回的数据成一个统一的格式,以便前端更好地处理数据。
以下是示例说明:
- 在控制器中定义一个返回类型为
ApiResponse
的方法,返回一个列表类型的数据。
[HttpGet]
public async Task<ApiResponse<List<Student>>> GetStudentsAsync()
{
var students = await _studentService.GetStudentsAsync();
return new ApiResponse<List<Student>>(200, "获取成功", students);
}
这个方法返回了一个状态码为 200、描述为“获取成功”、学生实体对象的列表 students
的 ApiResponse
对象。
- 在控制器中定义一个返回类型为
ApiResponse
的方法,返回一个学生实体对象。
[HttpGet("{id}")]
public async Task<ApiResponse<Student>> GetStudentAsync(int id)
{
var student = await _studentService.GetStudentAsync(id);
if (student == null)
{
return new ApiResponse<Student>(404, "未找到该学生", null);
}
return new ApiResponse<Student>(200, "获取成功", student);
}
这个方法返回了一个状态码为 200、描述为“获取成功”、学生实体对象 student
的 ApiResponse
对象。如果没有找到该学生,则返回一个状态码为 404、描述为“未找到该学生”的 ApiResponse
对象。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解ASP.NET Core WebApi 返回统一格式参数 - Python技术站