我们需要将所有商品数据发送回API进行更新,并且无法实现多用户工作。例如,编辑器可以发送5秒钟的旧数据,并覆盖其他记者2秒钟前所做的修复,而我无法向客户解释这一点,因为发布文章的人实际上与更新内容没有任何关系。
无论您做什么,这种事情都是一个挑战,这与分布式源代码管理(Mercurial,git等)非常相似,并且以HTTP / ReST拼写的解决方案看起来有些相似。
假设您有两个用户Alice和Bob都在工作/articles/lunch
。(为清楚起见,回复以黑体显示)
首先,爱丽丝创建文章。
PUT /articles/lunch HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic YWxpY2U6c2VjcmV0
Hey Bob, what do you want for lunch today?
301 Moved Permanently
Location: /articles/lunch/1
服务器未创建资源,因为没有附加到请求的“版本”(假设标识符为/articles/{id}/{version}
。要执行创建,将Alice重定向到将要创建的文章/版本的url。Alice的用户然后,代理将在新地址处重新应用该请求。
PUT /articles/lunch/1 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic YWxpY2U6c2VjcmV0
Hey Bob, what do you want for lunch today?
201 Created
现在,该文章已创建。接下来,鲍勃看一下这篇文章:
GET /articles/lunch HTTP/1.1
Host: example.com
Authorization: Basic Ym9iOnBhc3N3b3Jk
301 Moved Permanently
Location: /articles/lunch/1
鲍勃看着那里:
GET /articles/lunch/1 HTTP/1.1
Host: example.com
Authorization: Basic Ym9iOnBhc3N3b3Jk
200 Ok
Content-Type: text/plain
Hey Bob, what do you want for lunch today?
他决定添加自己的更改。
PUT /articles/lunch/1 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic Ym9iOnBhc3N3b3Jk
Hey Bob, what do you want for lunch today?
Does pizza sound good to you, Alice?
301 Moved Permanently
Location: /articles/lunch/2
与爱丽丝一样,鲍勃被重定向到他将要创建新版本的位置。
PUT /articles/lunch/2 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic Ym9iOnBhc3N3b3Jk
Hey Bob, what do you want for lunch today?
Does pizza sound good to you, Alice?
201 Created
最后,爱丽丝决定自己要添加到自己的文章中:
PUT /articles/lunch/1 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic YWxpY2U6c2VjcmV0
Hey Bob, what do you want for lunch today?
I was thinking about getting Sushi.
409 Conflict
Location: /articles/lunch/3
Content-Type: text/diff
---/articles/lunch/2
+++/articles/lunch/3
@@ 1,2 1,2 @@
Hey Bob, what do you want for lunch today?
-Does pizza sound good to you, Alice?
+I was thinking about getting Sushi.
不同于正常的重定向,而是将不同的状态代码返回给客户端409
,这告诉Alice她尝试从其分支的版本已被分支。无论如何都创建了新资源(如Location
标题所示),并且两者之间的差异都包含在响应主体中。爱丽丝现在知道她刚刚发出的请求需要以某种方式进行合并。
所有这些重定向都与的语义有关PUT
,这需要在请求行要求的确切位置创建新资源。这样也可以节省使用的请求周期POST
,但随后版本号将必须由其他魔术来编码在请求中,这对我来说似乎不太明显,但在实际的API中可能仍会首选最小化请求/响应周期。
api/article?action=publish
?查询参数适用于资源状态取决于您提到的“算法”(或操作)的情况。例如api/articles?sort=asc
,有效