当客户端尝试更新客户端上过时的数据实体时,什么HTTP状态代码是合适的?
我已经构建了一个API,客户端将指示服务器更新数据库中的某些实体,并且它必须能够容纳多个试图在同一数据实体上操作的用户,可能是在“同一时间” 这是一个分布式用户竞争条件问题。(类似于Wordpress在其他用户编辑博客文章时处理博客文章“锁定”的方式。)当客户端尝试更新客户端上过时的数据实体时,什么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,
示例数据实体
{
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
,它将收到412B
应该同步资源C
并再次尝试编辑它。我认为API应该响应,同时在正文中包含资源的最新状态(建筑,在您的情况下)以帮助消费者识别最新版本。@Opal好问题。你现在怎么想?看了W3规范,并与Opal的问题进行了比较,这是正确的答案(和代码)。如果正在检查标头,则会抛出412,但这里的情况并非如此。