虽然HTTP 1.1 规范似乎允许DELETE请求上的消息体,但它似乎表明服务器应该忽略它,因为它没有定义的语义。
4.3 消息体
服务器应该在任何请求上读取并转发消息体;如果请求方法不包括为实体主体定义的语义,则在处理请求时应该忽略消息主体。
我已经回顾了关于 SO 及其他主题的几个相关讨论,例如:
大多数讨论似乎都同意在 DELETE 上提供消息正文可能是允许的,但通常不建议这样做。
此外,我注意到各种 HTTP 客户端库中的一种趋势,这些库似乎正在记录越来越多的增强功能,以支持 DELETE 上的请求正文。大多数图书馆似乎都有义务,尽管偶尔会有一点最初的阻力。
我的用例要求在 DELETE 上添加一些必需的元数据(例如,删除的“原因”,以及删除所需的一些其他元数据)。我考虑了以下选项,但这些选项似乎都不完全合适且符合 HTTP 规范和/或 REST 最佳实践:
- 消息体- 规范表明 DELETE 上的消息体没有语义值;HTTP 客户端不完全支持;非标准做法
- 自定义 HTTP 标头- 要求自定义标头通常违反标准做法;使用它们与我的 API 的其余部分不一致,这些都不需要自定义标头;此外,没有好的 HTTP 响应可用于指示错误的自定义标头值(可能完全是一个单独的问题)
- 标准 HTTP 标头- 没有合适的标准标头
- 查询参数- 添加查询参数实际上会更改被删除的请求 URI;违反标准做法
- POST 方法-(例如
POST /resourceToDelete { deletemetadata }
)POST 不是删除的语义选项;POST 实际上代表期望的相反动作(即 POST 创建资源下属;但我需要删除资源) - 多种方法- 将 DELETE 请求拆分为两个操作(例如 PUT 删除元数据,然后删除)将原子操作拆分为两个,可能会留下不一致的状态。删除原因(和其他相关元数据)不是资源表示本身的一部分。
我的第一个偏好可能是使用消息正文,其次是自定义 HTTP 标头;然而,如前所述,这些方法也有一些缺点。
是否有任何符合 REST/HTTP 标准的建议或最佳实践来在 DELETE 请求中包含此类必需的元数据?还有其他我没有考虑过的替代方案吗?