# 错误与状态码

根据 HTTP 状态码处理 API 错误。

所有错误的 JSON 结构只有一个键：

```json
{
  "error": "provide exactly one of novel or novelId"
}
```

`error` 为便于诊断的英文说明，不是稳定的机器错误枚举。客户端应先按 HTTP 状态码判断。
批量参数错误可能附带 `volumes[0]`、`chapters[1]` 等零基下标。

| HTTP 状态 | 场景 |
| --- | --- |
| 200 | 获取、覆盖/新增单卷单章、已有小说批量续传成功。 |
| 201 | 创建平台、作者、标签、小说，或批量上传中新建小说成功。 |
| 204 | 删除成功，无响应体。 |
| 400 | 缺字段、未知字段/查询键、类型/范围错误、空标题/正文、NUL、JSON 错误、单批重复序号/数量超限、非法关联、批量模式冲突。 |
| 401 | 缺少/错误/重复的 Authorization。返回 `WWW-Authenticate: Bearer`。鉴权先于路由检查。 |
| 404 | 路径不存在，或获取/删除/更新的目标不存在；续传小说不存在。 |
| 405 | 路径不支持该请求方法，返回 `Allow` 头。 |
| 409 | 数据唯一性冲突（含标签重名），或试图删除仍包含章节的卷、仍被小说引用的标签。 |
| 413 | JSON 请求体超过 8 MiB。 |
| 415 | JSON 写入请求没有正确的 `Content-Type`，包括 multipart 上传。 |
| 500 | 未预期服务或数据库错误，不返回数据库内部细节。 |
| 504 | 数据库请求上下文超时。 |

引用错误与目标不存在的区别：`PUT /api/v2/content` 引用不存在的小说/卷是 400；
`GET /api/v2/content` 获取不存在的小说/章节是 404；`POST /api/v2/upload` 用不存在的 `novelId` 续传是 404。
