0

假设有一个名为 Draft '/api/drafts/' 的资源和另一个名为 Revision '/api/revisions/' 的资源。它们与一对一的关系相关。

要创建修订版,请在“/api/revisions/”上发出请求 POST,并在参数中提供草稿 ID。执行此操作的 JSON API 方式

POST /api/revisions/
Content-type: application/json

{
    "data": {
        "type": "revision",
        "links": {
            "draft": { "linkage": { "id": 1, "type": "draft" } }
        }
    }
}

这将创建修订资源,它与 Draft id=1 相关。所以响应将如下:

201 Created
Content-type: application/json
{
    "data": {
        "id": 1,
        "type": "revision",
        "links": {
            "draft": { "linkage": { "id": 1, "type": "draft" } }
        }
    }
}

但是,POST /api/revisions/ 有副作用;它会更改草稿的属性。

例如)draft.revision_count:0 => 1

然而,客户所做的只是请求创建修订并因此接收创建的修订资源,并且无法知道草稿的数据是否已更改。

我的问题是,服务器是否有责任让客户端知道通过创建修订其他资源会受到影响并需要更新?

4

1 回答 1

0

服务器不应在响应中告诉客户端POST /api/revisions草稿更改。

但是客户不应该期望它知道的草案的客户状态仍然有效。它应该提出请求

GET /api/drafts/1
If-None-Match: "etag-of-this-draft-the-server-returned-last-time"

的值If-None-Match将是服务器返回的ETag,以响应客户端先前为此资源所做的响应。如果草稿的服务器状态发生了变化,则 ETag 将不会执行,客户端将返回草稿的状态。如果草稿的服务器状态没有改变,服务器将以304.

如果客户端不能确保它知道的状态与当前服务器状态相匹配,那么当客户端尝试更改草稿时可能会发生冲突,例如,对其进行修改PUT。如果它If-None-Match在请求中包含标头PUT,服务器将能够检测到当前服务器状态与过时客户端状态之间的任何不匹配。它可以使用正确的 HTTP 状态代码进行响应。

于 2015-05-13T08:42:21.887 回答