使用HTTP 304响应POST

Iro*_*uck 16 rest post http http-post http-status-code-304

我有一个REST API,允许使用HTTP POST修改资源.客户端可能会提交POST请求,导致不修改资源.我正在考虑使用通常用于条件响应的304响应来表明请求没有效果.我没有找到任何这方面的例子,所以我想我会问这里,看看是否有其他人这样做或对此有意见.

Iro*_*uck 7

经过一番考虑后,我决定坚持使用未更改的资源实体进行正常的200响应.我最初的意图是提供一种简明的方法来向客户表明资源未被修改.当我更多地考虑它时,我意识到为了对304响应做任何有用的事情,他们必须已经有一个缓存版本,在这种情况下,将缓存副本的版本与返回的版本进行比较是微不足道的. 200响应.

  • 当然。304与未修改的响应有关,而与资源无关。仅当响应已被缓存并且客户端发出条件请求时,才可以使用304。客户端没有义务缓存任何内容,因此您不必依赖发送304。此外,您的Javascript会获得200而不是304(可能出于安全原因)。 (2认同)

ems*_*tol 6

我有一个 REST API,允许使用 HTTP POST 修改资源。客户端可能会提交一个 POST 请求,但该请求不会导致资源发生任何修改。

RESTful 方法中的 HTTP POST 意味着创建资源,而不是修改。对于修改,您应该使用 HTTP PUT。

您的问题的解决方案是,当某些内容被修改时,HTTP Status 200 OK ;当没有修改时,HTTP Status 204 No Content 。根据:

常见用例是作为 PUT 请求的结果返回 204,更新资源,而不更改向用户显示的页面的当前内容。如果资源已创建,则返回 201 Created。如果页面需要更改为新更新的页面,则应使用 200 代替。

-- MDN 网络文档


例如:

-- Request
POST /people HTTP/1.1
Content-Type: application/json

{
    "name": "John"
}

-- Response
HTTP/1.1 201 Created
Location: /people/1
Run Code Online (Sandbox Code Playgroud)
-- Request
PUT /people/1 HTTP/1.1
Content-Type: application/json

{
    "name": "John"
}

-- Response
HTTP/1.1 204 No Content
Run Code Online (Sandbox Code Playgroud)
-- Request
PUT /people/1 HTTP/1.1
Content-Type: application/json

{
    "name": "Robert"
}

-- Response
HTTP/1.1 200 OK
Content-Type: application/json

{
    "name": "Robert"
}
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,更改资源的正确方法是 PATCH。PUT 实际上应该用于替换资源,而不是更改资源。 (2认同)