Сосредоточившись на первом представлении, какой шаблон был бы хорошей практикой?
Мое предложение начинается с простой идеи: как бы вы сделали это как веб-страницы в HTML?
Вы, вероятно, начинаете со страницы, которая предлагает представление пользователя с такими гиперссылками, как «Обновить профиль», «Обновить роль», «Изменить пароль». При нажатии на профиль обновления будет загружена html-форма, возможно, с уже заполненными значениями по умолчанию. Оператор внесет изменения, затем отправит форму, которая отправит сообщение на конечную точку, которая знает, как расшифровать тело сообщения и обновить модель.
Первые два шага «безопасны» — оператор не предлагает никаких изменений. На последнем этапе оператор предлагает изменение, поэтому безопасные методы не подходят.
HTML, как формат гипермедиа, ограничен двумя методами (GET, POST), поэтому мы можем увидеть, как браузер делает что-то вроде
GET /user/:id
GET /forms/updateGeneralInformation?:id
POST /updates/generalInformation/:id
Существует множество вариантов написания, которые вы можете использовать, в зависимости от того, как вы предпочитаете организовывать свои ресурсы. Браузеру все равно, потому что он просто переходит по ссылкам.
У вас есть такая же гибкость в вашем API. Первым трюком в наборе всегда должно быть «могу ли я решить это с новым ресурсом?».
Ян Робинсон заметил: специализация и инновации зависят от открытого множества. Если вы ограничиваете себя закрытым словарем HTTP-методов, то открытый набор, который вам нужно внедрять, должен лежать где-то еще: подход RESTful заключается в использовании открытого набора ресурсов.
Обновление профиля действительно похоже на операцию, которая должна быть идемпотентной, поэтому вы хотели бы использовать PUT, если можете. Что-то не так с:
GET /user/:id/generalInformation
PUT /user/:id/generalInformation
Это запись, это идемпотент, это полная замена ресурса generalInformation, так что спецификация HTTP довольна.
Да, изменение текущего представления нескольких ресурсов с помощью одного запроса допустимо для HTTP. На самом деле это один из подходов, описанных в RFC 7231.
Частичные обновления содержимого возможны путем нацеливания на отдельно идентифицированный ресурс, состояние которого перекрывает часть более крупного ресурса.
Если вам не нравится поддержка нескольких представлений ресурса и поддержка PUT для каждого из них, вы можете применить ту же эвристику («добавить больше ресурсов»), введя очередь команд для обработки изменений базовой модели.
GET /user/:id/generalInformation
PUT /changeRequests/:uuid
Вам решать, хотите ли вы представлять все запросы на изменение как записи в одной коллекции или иметь специализированные коллекции запросов на изменение для подмножеств операций. Помидор, помидор.
person
VoiceOfUnreason
schedule
19.12.2016