リストの更新を定期的に受け取る Web サービスを設計しています。この時点で、リストは単一のエンティティ ( /lists/myList
) または多くのリソースを持つ実際のコレクション( ) としてモデル化でき/lists/myList/entries/<ID>
ます。リストは大きく (数百万のエントリ)、更新は小規模です (多くの場合、10 未満の変更)。
クライアントは配布する Web サービスの URL とリストを取得します。例:
- http://hostA/service/lists : list1、list2
- http://hostB/service/lists : list2、list3
- http://hostC/service/lists : list1、list3
次に、設定どおりにリストと更新をプッシュします。Web サービス URL の背後に何らかのデータベースが存在する可能性がありますが、不明です。
私は調査してきましたが、JSON パッチ形式を使用した HTTP PATCH が最良のアプローチであるようです。
コンテキストと例: 各リストには、識別名、優先順位、および何百万ものエントリがあります。各エントリには、ID (クライアントによって決定される) といくつかのオプションの属性があります。優先度 1 と 2 つのリスト エントリを持つリスト "requiredItems" を作成する例:
PUT /lists/requiredItems
Content-Type: application/json
{
"priority": 1,
"entries": {
"1": {
"color": "red",
"validUntil": "2016-06-29T08:45:00Z"
},
"2": {
"country": "US"
}
}
}
更新の場合、クライアントはまずサーバー上でリストがどのように見えるかを知る必要があります。このために、リスト エンティティにプロパティ「リビジョン」を追加します。
次に、この属性を照会します。
GET /lists/requiredItems?property=revision
次に、クライアントは、サーバー上のリビジョンとクライアントが認識している最新のリビジョンとの間で何を変更する必要があるかを確認し、JSON パッチを作成します。例:
PATCH /list/requiredItems
Content-Type: application/json-patch+json
[
{ "op": "test", "path": "revision", "value": 3 },
{ "op": "add", "path": "entries/3", "value": { "color": "blue" } },
{ "op": "remove", "path": "entries/1" },
{ "op": "remove", "path": "entries/2/country" },
{ "op": "add", "path": "entries/2/color", "value": "green" },
{ "op": "replace", "path": "revision", "value": 10 }
]
質問:
- このアプローチには、あまり使用されない HTTP 動詞 PATCH が原因で、クライアント サポートがわずかに少ないという欠点があります。HTTP の互換性 (冪等性など) を犠牲にすることなく、より互換性のあるアプローチはありますか?
- 個々のリスト エントリを個別のリソースとしてモデル化し、
PUT
andをDELETE
(おそらくETag
and/orと共にIf-Match
) 使用することはオプションのように思えます (PUT /lists/requiredItems/entries/3
,DELETE /lists/requiredItems/entries/1
PUT /lists/requiredItems/revision
)。しかし、更新チェーンの途中でネットワークが切断されたときに、これらすべての操作が確実に適用されるようにするにはどうすればよいでしょうか? HTTP PATCH は複数のリソースで動作できますか? - リストを「バージョン管理」するためのより良い方法はありますか?おそらく暗黙のうちに、リストの更新方法も改善されますか? クライアントがリビジョン番号を決定することに注意してください。
- でリビジョン番号を照会するのは正しい
GET /lists/requiredItems?property=revision
ですか? のような別のリソースにする必要があり/lists/requiredItems/revision
ますか?別のリソースにする必要がある場合、アトミックに更新するにはどうすればよいですか (つまり、リストとリビジョンの両方が更新されるか、両方が更新されないか)? - JSON パッチで最初にリビジョン値をテストしてから、同じパッチで
3
更新することはできますか?10