Допустим, у нас был следующий пользовательский документ. Как нам продолжить использовать api rest?
Обрабатывая документ как документ: внесите изменения локально и отправьте результат обратнона сервер.
Предполагая, что этот документ был доступен на /users/1/
, мы просто отправили бы обратно представление с удаленным хобби ...
PUT /users/1/
{
"_id": "1",
"firstName": "Joe",
"hobbies": [
],
}
Использование PATCH вместо PUT - этохорошо (при условии, что мы отправляем патч-документ как тело сообщения).Технически, вы также можете использовать POST, но POST здесь на самом деле не дает вам никаких преимуществ.
/users/:id/hobbies
/users/:id/hobbies/:id
Проблема с использованием таких идентификаторов заключается в том, что клиенты общего типа не признают, что им есть что-тоделать с /users/:id/
- поэтому, даже если вы отправите сообщение об удалении хобби, локально кэшированная копия клиента не будет обновлена (поскольку использует другой ключ).
Теперь, если ваши ресурсы были спроектированыиспользуя ссылки
{
"_id": "1",
"firstName": "Joe",
"hobbies": [ { "href": "/users/1/hobbies/4" } ]
}
Тогда мы все равно будем использовать /users/1/
для добавления / удаления хобби из коллекции, но если мы захотим изменить представление самого хобби, то мы быотправлять сообщения, используя /users/1/hobbies/4
.
Если бы сама коллекция хобби была ссылкой ...
{
"_id": "1",
"firstName": "Joe",
"hobbies": "/users/1/hobbies"
}
Тогда мы добавляли / удаляли хобби, отправляя сообщения на /users/1/hobbies
.
Это может помочь подумать о веб-страницах - HTML-представление веб-страницы часто будет содержать ссылки на изображения или сценарии, которые извлекаются и кэшируются отдельно от самой страницы.Если бы мы хотели отредактировать HTML, мы бы отправили запрос с использованием идентификатора страницы, если мы захотим изменить скрипт, мы бы отправили идентификатор для скрипта.