DELETE请求正文的RESTful替代方法

尽管HTTP 1.1规范似乎允许DELETE请求上的消息体,但它似乎表明服务器应该忽略它,因为它没有定义的语义。

4.3消息正文

服务器应该根据任何请求读取和转发消息主体; 如果请求方法不包含实体主体的定义语义,那么在处理请求时应该忽略消息主体。

我已经在SO及更高版本上回顾了有关此主题的若干相关讨论,例如:

  • 是否允许实体主体使用HTTP DELETE请求?
  • HTTP请求方法的有效载荷
  • 带请求正文的HTTP GET
  • 大多数讨论似乎都认为可以允许在DELETE上提供消息正文,但通常不推荐。

    此外,我已经注意到各种HTTP客户端库中的一种趋势,在这些库中越来越多的增强功能似乎已经记录下来,以便这些库支持DELETE上的请求体。 大多数图书馆似乎都有责任,尽管偶尔会遇到一些初步阻力。

    我的用例需要在DELETE上添加一些必需的元数据(例如删除的“原因”以及删除所需的其他一些元数据)。 我考虑过以下选项,其中没有一个看起来完全合适,并且与HTTP规范和/或REST最佳实践一致:

  • 消息体 - 规范表明DELETE上的消息体没有语义值; HTTP客户端不完全支持; 不是标准的做法
  • 自定义HTTP - 要求自定义标头通常违反标准做法; 使用它们与我的其余API不一致,其中没有一个需要自定义标题; 此外,没有好的HTTP响应可用于指示不良的自定义标头值(可能完全是一个单独的问题)
  • 标准HTTP头 - 没有标准头是适当的
  • 查询参数 - 添加查询参数实际上改变了被删除的Request-URI; 违反标准做法
  • POST方法 - (例如POST /resourceToDelete { deletemetadata } )POST不是删除的语义选项; POST实际上表示所需的相反动作(即POST创建资源下属;但我需要删除资源)
  • 多种方法 - 将DELETE请求分成两个操作(例如,PUT删除元数据,然后DELETE)将原子操作拆分为两个操作,可能会留下不一致的状态。 删除原因(和其他相关的元数据)不是资源表示本身的一部分。
  • 我的第一选择可能是使用邮件正文,其次是自定义HTTP头; 然而,正如所指出的那样,这些方法有一些缺点。

    是否有任何建议或最佳实践与REST / HTTP标准一起在DELETE请求中包含必需的元数据? 有没有其他的选择我没有考虑过?


    尽管一些建议不要使用DELETE请求的消息正文,但在某些使用情况下,此方法可能适用。 这是我们在评估问题/答案中提及的其他选项并与服务消费者合作后最终使用的方法。

    尽管邮件正文的使用并不理想,但其他选项都没有完全适合。 请求主体DELETE允许我们轻松而清楚地添加伴随DELETE操作所需的附加数据/元数据的语义。

    我仍然愿意接受其他的想法和讨论,但想要在这个问题上结束这个循环。 我感谢大家对此主题的想法和讨论!


    你似乎想要的是两件事之一,它们都不是纯粹的DELETE

  • 你有两个业务,一个PUT的删除原因后跟一个DELETE的资源。 一旦删除,任何人都无法再访问该资源的内容。 “原因”不能包含指向已删除资源的超链接。 要么,
  • 您试图通过使用DELETE方法将资源state=active 更改state=deleted 。 状态=已删除的资源会被主API忽略,但对于管理员或具有数据库访问权限的用户而言仍然可读。 这是允许的 - DELETE不必删除资源的后备数据,只需删除在该URI处公开的资源。
  • 任何需要DELETE请求上的消息正文的操作都可以分解为最常用的操作, POST可以完成消息正文所需的所有任务以及DELETE 。 我没有理由打破HTTP的语义。


    鉴于你的情况,我会采取以下方法之一:

  • 发送PUT或PATCH :由于需要删除原因,我推断删除操作是虚拟的。 因此,我认为通过PUT / PATCH操作更新记录是一种有效的方法,即使它本身不是DELETE操作。
  • 使用查询参数 :资源URI未被更改。 我其实认为这也是一种有效的方法。 您链接的问题是如果查询参数丢失,则不允许删除。 在你的情况下,如果原因没有在查询字符串中指定,我只会有一个默认原因。 资源仍然是resource/:id 。 您可以通过资源上的链接标头来查找每个原因(每个标签上都有一个rel标签以标识原因)。
  • 每个理由使用一个单独的端点 :使用像resource/:id/canceled的URL。 这实际上改变了Request-URI,绝对不是RESTful。 同样,链接头可以使这个发现。
  • 请记住,REST不是法律或教条。 把它看作指导。 所以,如果不遵循针对问题域的指导意义,则不要。 只要确保您的API消费者了解了差异。

    链接地址: http://www.djcxy.com/p/12361.html

    上一篇: RESTful Alternatives to DELETE Request Body

    下一篇: How to get full REST request body using Jersey?