看别人代码两种都有,比如:
javascriptCopy Code // 方案1router.delete('/posts/:id') // 方案2router.post('/posts/delete')
RESTful API 的删除操作应根据场景和设计规范选择 DELETE
或 POST
方法,具体原则如下:
一、遵循 RESTful 规范的基本原则
语义明确性
DELETE
方法明确表示删除资源的语义,符合 RESTful 对 HTTP 方法的定义,适用于直接操作单一资源13。示例:
DELETE /posts/{id}
URI 设计规范
RESTful 要求 URI 仅标识资源而非动作,因此POST /posts/delete
包含动词,属于设计误区。
二、不同场景下的选择建议
单一资源删除 | DELETE | 符合幂等性(多次调用结果一致),且 URI 直接指向资源57。 | router.delete('/posts/:id') 6 |
批量删除 | POST 或 PUT | DELETE 方法通常不带请求体,批量 ID 可通过 URL 参数或 POST 请求体传递(需权衡规范与实现)67。 | POST /posts/batch-delete |
复杂业务操作 | POST | 若删除伴随其他逻辑(如日志记录、关联更新),可用 POST 表示非幂等操作47。 | POST /posts/{id}/soft-delete |
三、关键设计原则
幂等性要求
DELETE
是幂等方法,适用于需保证多次调用结果一致的场景(如物理删除)。POST
是非幂等方法,适用于非确定性操作(如标记删除后触发异步任务)。资源定位与动作分离
优先通过 URI 标识资源,用 HTTP 方法表示动作,避免
URI
中出现delete
等动词。
四、总结建议
默认选择
DELETE
:单一资源删除、物理删除、幂等操作允许使用
POST
:批量删除、复杂业务逻辑、框架限制(如部分前端库不支持DELETE
请求体)
// 规范做法(单一资源删除) router.delete('/posts/:id'); // :ml-citation{ref="1,6" data="citationList"} // 特殊场景(批量删除) router.post('/posts/batch-delete', body: { ids: [1,2,3] }); // :ml-citation{ref="6,7" data="citationList"}
0条评论
我要评论