Нет ничего плохого в том, чтобы указывать роль в URI.Ваша интуиция была на правильном пути.Я бы сделал это следующим образом.
PUT: locahost: 8080 / api / users / {userid} / role / {roleId}
И вот почему.
FIRST: Глагол PUT идемпотент .Другими словами (взято прямо из спецификации)
... побочные эффекты от N> 0 идентичных запросов такие же, как и для одного запроса.
Что, я полагаю, вы хотите в этом отношении?Вы не хотите, чтобы в вашем хранилище состояний было несколько записей для каждого экземпляра пользователя и роли.Пользователь должен чувствовать себя комфортно, выполняя один и тот же запрос PUT, не оказывая негативного влияния (добавляя дублирующиеся записи) на систему.
При выполнении того же действия с POST я ожидал, что для каждого запроса будет создана новая запись.
SECOND: глагол PUT должен идентифицировать конкретный ресурс.(взято прямо из спецификации)
... Запрос PUT идентифицирует объект, заключенный в запросе - пользовательский агент знает, для чего предназначен URI, и сервер НЕ ДОЛЖЕН пытаться применить запрос к некоторымдругой ресурс.Если сервер желает, чтобы запрос был применен к другому URI, он ДОЛЖЕН послать ответ 301 (перемещен постоянно);Затем пользовательский агент МОЖЕТ принять собственное решение относительно того, следует ли перенаправить запрос.
Что если роль R102 устареет, а R104 предпочтительнее?Верните 301 (перемещено навсегда) с заголовком (расположение: localhost: 8080 / api / users / {userid} / role / R104).
НАКОНЕЦ: Когда все работает хорошо.Вернуть 201 (Создано) при создании и 200 (Без содержимого) при каждом последующем запросе к одному и тому же URIЕсли они предоставляют роль, которой нет в системе, верните 501 (не реализовано).