虽然HTTP 1.1 spec似乎允许请求DELETE邮件正文,但似乎表明服务器应该忽略它,因为没有定义它的语义。DELETE请求正文的RESTful替代
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客户端不完全支持;不是标准做法
- 自定义HTTP标头 - 要求自定义标头通常是against standard practices;使用它们与我的其余API不一致,其中没有一个需要自定义标题;此外,可没有好HTTP响应,指示坏习惯头值(可能是完全独立的问题)
- 标准HTTP标头 - 没有标准的标题是适当
- 查询参数 - 添加查询参数实际上改变了请求 - URI被删除; against standard practices
- POST方法 - (例如
POST /resourceToDelete { deletemetadata }
)POST不是删除的语义选项; POST实际上代表所需的相反动作(即POST创建资源下属;但我需要删除该资源) - 多种方法 - 拆分删除请求为两个操作(例如PUT删除的元数据,然后删除)分裂的原子操作分为两个,可能会留下不一致的状态。删除原因(和其他相关的元数据)不是资源表示本身的一部分。
我的第一选择可能是使用邮件正文,其次是自定义HTTP头;然而,正如所指出的那样,这些方法有一些缺点。
是否有任何建议或最佳实践与REST/HTTP标准一起在DELETE请求中包含这些必需的元数据?有没有其他的选择我没有考虑过?
像某些实现'Jersey'不允许身体'delete'请求。 – basiljames
对这个问题看起来好像没有好的答案。 – niico