在发出HTTP DELETE请求时,请求URI应该完全标识要删除的资源。但是,是否允许添加额外的元数据作为请求实体主体的一部分?
当前回答
对Body使用DELETE是有风险的…比起REST,我更喜欢这种列表操作方法:
常规操作
GET /objects/获取所有对象
GET /object/ID获取指定ID的对象
POST /objects添加一个新对象
PUT /object/ID添加指定ID的对象,更新对象
DELETE /object/ID删除指定ID的对象
所有自定义操作都是POST
POST /objects/addList添加body中包含的对象列表或数组
POST /objects/deleteList删除包含在body中的对象列表
POST /objects/customQuery基于body中的自定义查询创建一个List
如果客户不支持您的扩展操作,他们可以以常规方式工作。
其他回答
ElasticSearch似乎使用了这个: https://www.elastic.co/guide/en/elasticsearch/reference/5.x/search-request-scroll.html#_clear_scroll_api
也就是说妮蒂支持这个。
就像评论中提到的那样,情况可能不再是这样了
在我看来,RFC 2616并没有规定这一点。
从第4.3节开始:
The presence of a message-body in a request is signaled by the inclusion of a Content-Length or Transfer-Encoding header field in the request's message-headers. A message-body MUST NOT be included in a request if the specification of the request method (section 5.1.1) does not allow sending an entity-body in requests. A server SHOULD read and forward a message-body on any request; if the request method does not include defined semantics for an entity-body, then the message-body SHOULD be ignored when handling the request.
9.7节:
The DELETE method requests that the origin server delete the resource identified by the Request-URI. This method MAY be overridden by human intervention (or other means) on the origin server. The client cannot be guaranteed that the operation has been carried out, even if the status code returned from the origin server indicates that the action has been completed successfully. However, the server SHOULD NOT indicate success unless, at the time the response is given, it intends to delete the resource or move it to an inaccessible location. A successful response SHOULD be 200 (OK) if the response includes an entity describing the status, 202 (Accepted) if the action has not yet been enacted, or 204 (No Content) if the action has been enacted but the response does not include an entity. If the request passes through a cache and the Request-URI identifies one or more currently cached entities, those entries SHOULD be treated as stale. Responses to this method are not cacheable.c
因此,它没有显式地允许或禁止,并且代理可能会删除消息体(尽管它应该读取并转发它)。
其他几个回答提到了RFC 7231,它有效地说了DELETE请求可以有一个主体,但不推荐。
在2022年,RFC 7231被RFC 9110: HTTP语义所取代,它现在说:
[...] content received in a DELETE request has no generally defined semantics, cannot alter the meaning or target of the request, and might lead some implementations to reject the request and close the connection [...]. A client SHOULD NOT generate content in a DELETE request unless it is made directly to an origin server that has previously indicated, in or out of band, that such a request has a purpose and will be adequately supported. An origin server SHOULD NOT rely on private agreements to receive content, since participants in HTTP communication are often unaware of intermediaries along the request chain.
这种语言在之前的语言基础上得到了加强,也就是说,即使它是允许的,在使用它时也需要非常小心,因为(例如)一些用户可能在代理的背后,为了打击“请求走私”而从请求中剥离主体。
实际答案:不
有些客户端和服务器会忽略甚至删除delete请求中的主体。在极少数情况下,它们会失败并返回错误。
值得注意的是,OpenAPI 3.0版本的规范放弃了对带体的DELETE方法的支持:
请看这里和这里的参考资料
这可能会影响将来这些api的实现、文档或使用。
推荐文章
- 用Spring我可以做一个可选的路径变量吗?
- 什么是HTTP“主机”报头?
- 哪个HTTP状态代码表示“尚未准备好,稍后再试”?
- Django REST框架:向ModelSerializer添加额外字段
- 如何阻止恶意代码欺骗“Origin”报头来利用CORS?
- 为什么说“HTTP是无状态协议”?
- 我需要HTTP GET请求的内容类型报头吗?
- REST和RPC之间的Web服务差异
- 如何让Chrome允许混合内容?
- 正确的方式删除cookies服务器端
- REST DELETE真的是幂等的吗?
- 如何用node.js实现一个安全的REST API
- 如何在Node.js内进行远程REST调用?旋度吗?
- 了解Chrome网络日志“停滞”状态
- 用户代理字符串可以有多大?