DELETE
用法
DELETE 请求指示服务器删除目标资源。服务器决定删除在实际中的含义:资源可能被永久擦除、归档,或标记为非活动状态。
REST API 高度依赖 DELETE 来表示资源的销毁。像 DELETE /api/users/123 这样的 API 端点清晰地表达了删除由 123 标识的用户记录的意图。这直接对应于用于创建、更新、读取和销毁操作的 PUT/POST/GET/DELETE 模式。
HTML 表单只支持 GET 和 POST。fetch 和 XMLHttpRequest 等 JavaScript API 原生支持 DELETE。一些框架使用带有 _method=DELETE 参数的 POST 作为变通方案。
服务器会根据结果返回以下几种状态码之一:
硬删除会永久移除资源。后续的 GET 请求返回 404 或 410 Gone。软删除将资源标记为非活动状态,但不删除底层数据。资源仍可通过管理 API 或使用查询参数检索。410 表示永久移除,而当资源在该 URI 处不再存在时,404 更为合适。
DELETE 请求是幂等的。多次发送相同的请求所产生的服务器状态,与只发送一次请求相同。第一个请求移除资源,后续请求不再产生额外影响。不过响应码可能不同:第一个请求返回 200 OK 或 204 No Content,而之后的请求返回 404 Not Found 或 410 Gone。
删除资源
客户端请求移除某个特定文件。服务器移除该文件并以 204 No Content 响应,在没有消息体的情况下确认操作。
请求
DELETE /uploads/report.pdf HTTP/1.1
Host: api.example.re
响应
HTTP/1.1 204 No Content
带确认信息的 REST API 删除
REST API 返回 200 OK 及一个 JSON 响应体,确认删除并标识被移除的资源。
请求
DELETE /api/users/123 HTTP/1.1
Host: api.example.re
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...
响应
HTTP/1.1 200 OK
Content-Type: application/json
{"deleted": true, "id": 123}
Authorization 请求头携带一个 bearer 令牌,因为大多数 API 在允许执行破坏性操作之前都要求进行身份验证。
CORS
跨域 DELETE 请求始终会触发 CORS 预检。浏览器会先发送一个 OPTIONS 请求,以确认服务器允许对目标资源执行 DELETE。
请求体与响应体
DELETE 请求可以包含请求体,但其语义是未定义的。由于存在请求走私风险,一些中间设备会拒绝带请求体的 DELETE 请求。大多数 API 不为 DELETE 使用请求体。当需要请求体时(例如批量删除),由服务器定义预期的格式。
响应体取决于状态码。200 OK 响应包含描述结果或返回被删除资源的响应体。204 No Content 响应在没有响应体的情况下确认删除。202 Accepted 响应表示删除已排队或正在进行中,通常包含一个指向状态监视器的引用。
响应状态码
204 No Content 是最常见的响应,用于无需响应体的直接删除操作。当服务器在响应体中返回被删除的资源或确认消息时,200 OK 更为合适。
202 Accepted 表示删除已排队或为异步操作。响应通常包含一个 Location 请求头或响应体,指向客户端可检查进度的状态端点。
对已删除资源的后续请求返回 404 Not Found 或 410 Gone。410 响应表示资源先前存在且被有意移除,而 404 不做此区分。