Я разрабатываю веб-службу для регулярного получения обновлений списков. На данный момент список все еще может быть смоделирован как единый объект (/lists/myList
) или фактическая коллекция со многими ресурсами (/lists/myList/entries/<ID>
). Списки большие (миллионы записей), а обновления небольшие (часто менее 10 изменений).HTTP ReST: обновление больших коллекций: лучший подход, чем JSON PATCH?
Клиент получает URL-адреса службы веб и списки для распространения, например:
- http://hostA/service/lists: песни1, песни2
- http://hostB/service/lists: list2, песни3
- http://hostC/service/lists: список1, песни3
Затем он будет настраивать списки и обновления. Вероятно, но не определено, есть ли какая-либо база данных за URL-адресами веб-службы.
Я занимаюсь исследованием, и, кажется, HTTP PATCH с использованием формата патча JSON - лучший подход.
Контекст и примеры: Каждый список имеет идентифицирующее имя, приоритет и миллионы записей. Каждая запись имеет идентификатор (определяется клиентом) и несколько необязательных атрибутов. Пример, чтобы создать список «requiredItems» с приоритетом 1 и два списка записей:
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-глагола пластыря. Существует ли более совместимый подход, не жертвуя поддержкой HTTP (idempotency et cetera)?
- Моделирование отдельных записей списка в виде отдельных ресурсов и использования
PUT
иDELETE
(возможно, сETag
и/или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
в том же патче?
Пожалуйста, не спрашивайте более одного вопроса за раз. Все они действительны, но вы, вероятно, не получите ответа на все из них. –
@ LutzHorn: спасибо. Ты прав. Должен ли я удалить все, кроме одного вопроса, и переставить остальные отдельно? Вводная часть будет такой же ... –