4.7 Problem Details 与 OpenAPI
Problem Details 提供标准化错误响应格式,OpenAPI 提供机器可读接口文档。它们一起帮助前后端稳定协作、自动生成客户端、减少口头约定。
学习目标
- 能解释 Problem Details 的核心字段。
- 能在 API 中返回标准错误响应。
- 能为接口生成 OpenAPI 文档。
- 能理解 OpenAPI 对前端类型生成的价值。
应用场景
- 表单校验失败时返回字段错误。
- 统一处理 404、400、500 等失败响应。
- 前端根据 OpenAPI 生成 TypeScript 类型。
- 用 Swagger UI 手工调试接口。
Problem Details 字段
| 字段 | 说明 |
|---|---|
type | 错误类型文档地址或稳定标识 |
title | 简短错误标题 |
status | HTTP 状态码 |
detail | 面向调用方的详细说明 |
instance | 当前请求或资源路径 |
示例:返回校验错误
app.MapPost("/todos", async (
CreateTodoRequest request,
TodoService service,
CancellationToken cancellationToken) =>
{
var errors = request.Validate();
if (errors.Count > 0)
{
return Results.ValidationProblem(errors);
}
var todo = await service.CreateAsync(request, cancellationToken);
return Results.Created($"/todos/{todo.Id}", todo);
});
OpenAPI 示例
builder.Services.AddOpenApi();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.MapOpenApi();
}
app.MapPost("/todos", CreateTodoAsync)
.WithName("CreateTodo")
.WithSummary("创建任务")
.Produces<TodoDto>(StatusCodes.Status201Created)
.ProducesValidationProblem();
重点难点
- OpenAPI 文档要反映真实响应,不要只写成功路径。
- 错误格式标准化后,前端可以做统一错误处理。
- Problem Details 是格式标准,不替代业务错误码设计。
- 生产环境是否开放 Swagger UI 要结合安全策略决定。
常见误区
| 误区 | 推荐做法 |
|---|---|
| 只文档化 200 响应 | 同时声明 400、401、403、404、500 |
| Swagger 能打开就算完成 | 确保 DTO、状态码、错误格式准确 |
| 每个接口自定义错误 JSON | 使用统一 Problem Details 或扩展格式 |
练习
- 给任务创建接口添加
ProducesValidationProblem。 - 给 404 返回 Problem Details。
- 用 OpenAPI 文档检查前端 API Client 的类型是否一致。
延伸阅读
- RFC 9457 Problem Details。
- ASP.NET Core OpenAPI。
- Swagger UI 与客户端生成。