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