虽然HTTP 1.1 规范 http://www.w3.org/Protocols/rfc2616/rfc2616.html好像allow消息正文DELETE http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.7请求,它似乎表明服务器应该忽略它,因为它没有定义的语义。
4.3 消息体
服务器应该读取并转发任何请求的消息主体;如果
请求方法不包括实体主体的定义语义,
那么处理请求时应该忽略消息正文。
我已经回顾过有关此主题的一些相关讨论以及其他内容,例如:
- HTTP DELETE 请求是否允许使用实体主体? https://stackoverflow.com/questions/299628/is-an-entity-body-allowed-for-an-http-delete-request
- HTTP 请求方法的有效负载 https://stackoverflow.com/questions/5905916/payloads-of-http-request-methods
- 带请求正文的 HTTP GET https://stackoverflow.com/questions/978061/http-get-with-request-body
大多数讨论似乎都同意在 DELETE 上提供消息正文可能是allowed,但一般不推荐。
此外,我注意到各种 HTTP 客户端库的趋势,这些库似乎记录了越来越多的增强功能,以支持 DELETE 上的请求主体。大多数图书馆似乎都会这样做,尽管最初偶尔会遇到一些阻力。
我的用例要求在删除时添加一些必需的元数据(例如删除的“原因”,以及删除所需的一些其他元数据)。我考虑了以下选项,但没有一个看起来完全合适且符合 HTTP 规范和/或 REST 最佳实践:
-
邮件正文- 规范表明 DELETE 上的消息体没有语义值; HTTP 客户端不完全支持;不是标准做法
-
自定义 HTTP 标头- 通常需要自定义标头违反标准做法 http://my.safaribooksonline.com/book/-/9781449317904/4dot-metadata-design/id2829455;使用它们与我的 API 的其余部分不一致,其中都不需要自定义标头;此外,没有好的 HTTP 响应可用于指示错误的自定义标头值(可能完全是一个单独的问题)
-
标准 HTTP 标头- 没有合适的标准标题
-
查询参数- 添加查询参数实际上改变了被删除的Request-URI;违反标准做法 https://stackoverflow.com/questions/2539394/rest-http-delete-and-parameters
-
邮寄方式-(例如
POST /resourceToDelete { deletemetadata }
) POST 不是删除的语义选项; POST实际上代表的是opposite所需的操作(即 POST 创建资源从属;但我需要删除资源)
-
多种方法- 将 DELETE 请求拆分为两个操作(例如,PUT 删除元数据,然后 DELETE)将原子操作拆分为两个,可能会留下不一致的状态。删除原因(和其他相关元数据)不是资源表示本身的一部分。
我的第一选择可能是使用消息正文,其次是自定义 HTTP 标头;然而,正如所指出的,这些方法也有一些缺点。
是否有任何符合 REST/HTTP 标准的建议或最佳实践,可以在 DELETE 请求中包含此类所需的元数据?还有其他我没有考虑过的替代方案吗?
尽管有些建议不要将消息正文用于 DELETE 请求,但此方法可能适合某些用例。这是我们在评估问题/答案中提到的其他选项并与服务的消费者合作后最终使用的方法。
虽然消息正文的使用并不理想,但其他选项也都不是完美合适的。请求正文 DELETE 使我们能够轻松、清晰地添加 DELETE 操作所需的附加数据/元数据的语义。
我仍然愿意接受其他想法和讨论,但想结束这个问题的循环。我感谢大家对此主题的想法和讨论!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)