尽管HTTP 1.1规范似乎允许DELETE请求上的消息正文,但它似乎表明服务器应该忽略它,因为没有定义的语义。
4.3邮件正文
服务器应根据任何请求读取并转发消息正文;如果请求方法不包括为实体主体定义的语义,则在处理请求时应忽略消息主体。
我已经回顾了关于SO及其它主题的一些相关讨论,例如:
大多数讨论似乎都同意,可以允许在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请求中?还有其他我没有考虑过的选择吗?
Jersey
不允许正文进行delete
请求。