更新のためにすべての記事データをAPIに送信する必要があり、マルチユーザー作業を実装できませんでした。たとえば、エディターは5秒前のデータを送信し、他のジャーナリストが2秒前に行った修正を上書きすることができます。また、記事を公開している人はコンテンツの更新とはまったく関係がないため、これをクライアントに説明する方法はありません。
この種のことは、あなたが何をするにしてもチャレンジです。それは分散ソース管理(mercurial、gitなど)と非常に似た問題であり、HTTP / ReSTで綴られたソリューションは少し似ています。
AliceとBobの2人のユーザーがいて、両方ともで作業しているとし/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
リクエストに「バージョン」が添付されていなかったため、サーバーはリソースを作成しませんでした(IDを仮定します/articles/{id}/{version}
。作成を実行するために、アリスは作成する記事/バージョンのURLにリダイレクトされました。アリスのユーザーエージェントは新しいアドレスでリクエストを再適用します。
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
。これは、アリスに、彼女がブランチしようとしたバージョンがすでにブランチされていることを伝えます。とにかく(Location
ヘッダーで示されているように)新しいリソースが作成され、2つの間の違いが応答本文に含まれました。アリスは、今行ったリクエストを何らかの方法でマージする必要があることを知っています。
このリダイレクトはすべて、のセマンティクスに関連してPUT
います。これは、要求行が要求する場所に新しいリソースを作成する必要があります。これはPOST
代わりに使用してリクエストサイクルを節約することもできますが、バージョン番号は他の魔法によってリクエストでエンコードする必要があります。要求/応答サイクルを最小限に抑えるため。
api/article?action=publish
ですか?クエリパラメータは、リソースの状態が、言及した「アルゴリズム」(またはアクション)に依存するような場合を対象としています。例:api/articles?sort=asc
有効