使用HTTP 304响应POST

使用HTTP 304响应POST,http,rest,post,http-post,http-status-code-304,Http,Rest,Post,Http Post,Http Status Code 304,我有一个RESTAPI,它允许使用HTTPPOST修改资源。客户端可能会提交一个POST请求,该请求不会导致对资源的修改。我正在考虑使用通常用于条件响应的304响应来表示请求没有效果。我还没有找到任何这样做的例子,所以我想我应该在这里询问一下,看看是否有其他人在做这件事,或者对这件事有什么看法。经过一些考虑,我决定使用不变的资源实体,坚持正常的200响应。我最初的意图是提供一种简洁的方式,向客户机表明资源没有被修改。当我进一步思考它时,我意识到为了对304响应做任何有用的事情,它们必须已经有了一

我有一个RESTAPI,它允许使用HTTPPOST修改资源。客户端可能会提交一个POST请求,该请求不会导致对资源的修改。我正在考虑使用通常用于条件响应的304响应来表示请求没有效果。我还没有找到任何这样做的例子,所以我想我应该在这里询问一下,看看是否有其他人在做这件事,或者对这件事有什么看法。

经过一些考虑,我决定使用不变的资源实体,坚持正常的200响应。我最初的意图是提供一种简洁的方式,向客户机表明资源没有被修改。当我进一步思考它时,我意识到为了对304响应做任何有用的事情,它们必须已经有了一个缓存版本,在这种情况下,比较缓存副本的版本和200响应中返回的版本是很简单的

我有一个RESTAPI,它允许使用HTTPPOST修改资源。客户端可能会提交一个POST请求,该请求不会导致对资源的修改


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

你的问题的解决方案是当某个东西被修改了,而没有修改的时候。根据:

常见用例是作为PUT请求的结果返回204,更新资源,而不改变显示给用户的页面的当前内容。如果创建了资源,则返回201 created。如果页面应更改为最新更新的页面,则应使用200

--


例如:

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

{
    "name": "John"
}

-- Response
HTTP/1.1 201 Created
Location: /people/1

在许多情况下,对于无法修改或创建资源的POST请求,最合适的响应代码应该是409(冲突)。您应该澄清您试图实现的目标。无论出于何种原因,如果客户端提交的帖子与资源已经具有的状态完全相同,那么请求不会有任何副作用-即资源不会被修改-因此304似乎是一个合适的响应。这肯定不是我的API中的错误,所以409是不合适的。当然,通常情况下,客户机会请求更改,而对于资源的新状态,响应将为200。在这种情况下,IMHO PUT(或补丁)请求更合适。然后,RFC清楚地了解了这个场景:如果PUT请求的请求URI引用了一个现有资源,那么应该认为该资源已被修改,服务器响应为200(确定)或204(无内容)。服务器可能会发送包含更详细信息的响应。也就是说,即使资源最终未被修改,也会被视为已修改。在我看来,这是有意义的。PUT仅适用于请求包含资源的整个状态的情况,这在我的API中从来都不是这种情况,因为资源的状态依赖于其他资源,客户端可以选择对资源的某个部分进行变异,而不必关心其他部分。即便如此,RFC对于200或204响应的含义还是相当模糊的。204是否意味着没有发生变化?修补程序是有意义的,但是我觉得还不够标准,而且响应代码的情况仍然是模糊的。当然。304是关于未修改的响应,而不是关于资源。仅当响应已缓存且客户端发出了条件请求时,才可以使用304。客户端没有义务缓存任何内容,因此您不能依赖于发送304。此外,您的Javascript得到的是200而不是304(可能是出于安全原因)。“RESTful方法中的HTTP POST意味着创建资源,而不是修改。对于修改,您应该使用HTTP PUT。”我不同意这一点。PUT应用于用新资源完全替换资源。POST可用于对资源进行更改。例如,从Spring的“理解REST”页面:“请求URI处的资源对提供的实体做一些事情。POST通常用于创建新实体,但也可以用于更新实体。”从技术上讲,更改资源的正确方法是补丁。PUT确实应该用于替换资源,而不是更改资源。
-- Request
PUT /people/1 HTTP/1.1
Content-Type: application/json

{
    "name": "John"
}

-- Response
HTTP/1.1 204 No Content
-- 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"
}