小码问答,有问必答!

RESTful API的删除方法到底用DELETE还是POST?

看别人代码两种都有,比如:

javascriptCopy Code
// 方案1router.delete('/posts/:id')
// 方案2router.post('/posts/delete')


全栈开发

收藏

1个回答

我要回答

  • author
    牛叔叔 2025-03-28 16:57

    RESTful API 的删除操作应根据场景和设计规范选择 DELETE 或 POST 方法,具体原则如下:

    一、遵循 RESTful 规范的基本原则

    1. ‌语义明确性‌
      DELETE 方法明确表示删除资源的语义,符合 RESTful 对 HTTP 方法的定义,适用于直接操作单一资源‌13。


      • 示例:DELETE /posts/{id}

    2. ‌URI 设计规范‌
      RESTful 要求 URI 仅标识资源而非动作,因此 POST /posts/delete 包含动词,属于设计误区‌。


    二、不同场景下的选择建议

    场景推荐方法说明示例代码
    ‌单一资源删除‌DELETE符合幂等性(多次调用结果一致),且 URI 直接指向资源‌57。router.delete('/posts/:id')‌6
    ‌批量删除‌POST 或 PUTDELETE 方法通常不带请求体,批量 ID 可通过 URL 参数或 POST 请求体传递(需权衡规范与实现)‌67。POST /posts/batch-delete
    ‌复杂业务操作‌POST若删除伴随其他逻辑(如日志记录、关联更新),可用 POST 表示非幂等操作‌47。POST /posts/{id}/soft-delete

    三、关键设计原则

    1. ‌幂等性要求‌

      • DELETE 是幂等方法,适用于需保证多次调用结果一致的场景(如物理删除)‌。

      • POST 是非幂等方法,适用于非确定性操作(如标记删除后触发异步任务)‌。

    2. ‌资源定位与动作分离‌

      • 优先通过 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"}