主题
RESTful
介绍
一句话理解:
REST 是一种架构风格,不是框架或严格的接口规范;RESTful 通常指遵循其资源导向思想设计的接口。日常 API 设计中,应使用 URI 标识资源,以 HTTP 方法表达请求意图,并用状态码说明处理结果。
URI 描述资源,不描述动作;动作优先由 HTTP 方法表达。具体的资源关系、响应结构和错误格式仍需要由 API 契约明确。
常见资源风格:
- 资源集合:
/users - 单个资源:
/users/{id}
创建 (Create)
- HTTP 方法:POST
- URI 示例:
/resources - 常见状态码:
- 201 Created:创建成功。应通过
Location指出主要新资源的地址;响应体可返回该资源或请求处理结果。 - 400 Bad Request:参数格式不对或缺少必要字段。
- 409 Conflict:要创建的数据和现有数据冲突(比如唯一键重复)。
- 201 Created:创建成功。应通过
响应示例:
http
POST /resources HTTP/1.1
Content-Type: application/json
{
"name": "New Resource"
}http
HTTP/1.1 201 Created
Content-Type: application/json
Location: /resources/123
{
"id": 123,
"name": "New Resource",
"created_at": "2024-06-27T12:34:56Z"
}读取 (Read)
- HTTP 方法:GET
- URI 示例:
/resources或/resources/{id} - 常见状态码:
- 200 OK:查询成功。
- 404 Not Found:按 id 查单个资源时,资源不存在。
响应示例:
http
GET /resources/123 HTTP/1.1http
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 123,
"name": "Existing Resource",
"created_at": "2024-06-27T12:34:56Z"
}实战里最容易混淆的一点:
- 搜索列表没查到数据:返回 200,body 给空数组,比如
[]。 - 按 id 查单个资源没查到:返回 404。
更新 (Update)
- HTTP 方法:PUT(以请求表示替换目标资源状态)或 PATCH(对目标资源应用部分修改)
- URI 示例:
/resources/{id} - 常见状态码:
- 200 OK:更新成功,并返回处理结果或更新后的资源。
- 204 No Content:更新成功,但不返回 body。
- 201 Created:使用
PUT向尚不存在、且由客户端指定的 URI 成功创建资源。 - 400 Bad Request:参数有问题。
- 404 Not Found:要更新的资源不存在。
- 412 Precondition Failed:
If-Match等条件请求不满足;可用于基于 ETag 的并发更新控制。
响应示例:
http
PUT /resources/123 HTTP/1.1
Content-Type: application/json
{
"name": "Updated Resource"
}http
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 123,
"name": "Updated Resource",
"updated_at": "2024-06-27T12:45:00Z"
}PUT 的语义是替换目标资源的状态,而非机械要求传入数据库中的每一个字段;服务端应在 API 契约中定义请求表示包含哪些字段。PATCH 的补丁格式也应明确,例如 JSON Merge Patch 或 JSON Patch。PATCH 不保证幂等,是否可安全重试取决于具体补丁操作。
也可以只返回状态码:
http
HTTP/1.1 204 No Content删除 (Delete)
- HTTP 方法:DELETE
- URI 示例:
/resources/{id} - 常见状态码:
- 202 Accepted:已接受删除请求,但操作尚未完成。
- 204 No Content:删除操作已完成,不返回 body。
- 200 OK:删除成功,并返回一段确认信息。
- 404 Not Found:资源不存在;是否将重复删除视为
404或成功响应,应由 API 契约统一规定。
响应示例:
http
DELETE /resources/123 HTTP/1.1http
HTTP/1.1 204 No Content补充:幂等性(面试常问)
- 幂等指同一请求重复执行时,对服务端的预期效果与执行一次相同;不要求每次返回相同的状态码或响应体。
- GET:安全且幂等。
- PUT:幂等。
- DELETE:幂等;首次删除可返回
204,后续请求是否返回404由接口契约决定。 - POST:通常非幂等(重复提交可能创建多条数据)。
- PATCH:不保证幂等,取决于补丁的定义与实现。
补充:错误响应建议统一
建议给前端统一的错误格式,方便处理和展示:
json
{
"code": "VALIDATION_ERROR",
"message": "name is required",
"details": [
{
"field": "name",
"reason": "required"
}
]
}总结
- 创建:POST + 201 Created(最好带 Location)。
- 读取:GET + 200;按 id 查不到用 404。
- 更新:PUT/PATCH + 200 或 204。
- 删除:DELETE + 204(或 200)。
- 列表为空返回 200 + 空数组,不要返回 404。
