当客户端尝试更新客户端上过时的数据实体时,什么HTTP状态代码是合适的?

当客户端尝试更新客户端上过时的数据实体时,什么HTTP状态代码是合适的?,http,http-status-codes,http-response-codes,Http,Http Status Codes,Http Response Codes,我已经构建了一个API,客户端将指示服务器更新数据库中的某些实体,并且它必须能够容纳多个试图在同一数据实体上操作的用户,可能是在“同一时间” 这是一个分布式用户竞争条件问题。(类似于Wordpress在其他用户编辑博客文章时处理博客文章“锁定”的方式。) 示例数据实体 { versionID : 12345, type : "building", name : "The CN Tower" } 对数据实体进行操作 { versionID : 12345,

我已经构建了一个API,客户端将指示服务器更新数据库中的某些实体,并且它必须能够容纳多个试图在同一数据实体上操作的用户,可能是在“同一时间”

这是一个分布式用户竞争条件问题。(类似于Wordpress在其他用户编辑博客文章时处理博客文章“锁定”的方式。)


示例数据实体

{
    versionID : 12345,
    type : "building",
    name : "The CN Tower"
}

对数据实体进行操作

{
    versionID : 12345,
    type : "building",
    name : "The CN Tower"
}
例如,客户端将告诉服务器更新任何给定实体的
名称
属性

为了处理试图更改同一实体的多个用户(而不是用户意外地覆盖彼此的更新),每个用户必须随其
更新
请求一起发送
版本ID
(也可能称为
状态ID
)在将数据库实体加载到UI(或在CLI应用程序中以其他方式存储在客户端)时,它从服务器获取该数据库实体

这样,如果
客户端A
客户端B
之前更新了建筑,服务器将能够告诉
客户端B
他们的更新请求失败,因为他们试图更新的建筑不是数据库中此类记录的当前(规范)状态


问题


当任何用户试图更新已由另一用户在此期间更新的数据库记录时,服务器的正确http是什么?

在这种情况下,服务器应使用状态代码进行回复

它通常使用以下标题(随请求一起发送):

  • 埃塔格
  • 如果修改自
  • 如果没有修改,自
服务器检查上面提到的一个头的值,如果它与客户端匹配,则允许修改资源,否则应返回
412


因此
A
想要编辑
C
,而
ETag
等于
10
。服务器接受此请求,编辑
C
计算新的
ETag
,例如
11
,并将资源发回。现在,如果
B
想要编辑
C
,并且
ETag
等于
10
,它将收到412
B
应该同步资源
C
并再次尝试编辑它。

我认为API应该响应,同时在正文中包含资源的最新状态(建筑,在您的情况下)以帮助消费者识别最新版本。

@Opal好问题。你现在怎么想?看了W3规范,并与Opal的问题进行了比较,这是正确的答案(和代码)。如果正在检查标头,则会抛出412,但这里的情况并非如此。