Разрабатывая API, мы столкнулись с вопросом, должна ли полезная нагрузка PUT содержать идентификатор обновляемого ресурса.
Вот что у нас сейчас есть:
PUT /users/123 Payload: {name: "Adrian"}
Наш код маршрута извлекает идентификатор из URI и продолжает обновление.
Первые пользователи нашего API задаются вопросом, почему мы не разрешаем ID в полезной нагрузке:
PUT /users/123 Payload: {id: 123, name: "Adrian"}
Причина, по которой мы этого не допустили, заключается в том, что идентификатор дублируется в полезной нагрузке и URI.
Размышляя об этом еще немного, мы связываем ресурс с URI.
Если URI не имеет идентификатора, необходимо изменить полезную нагрузку:
PUT /no/id/here Payload: {name: "Adrian"} < What user???
Есть ли причины не делать этого?
/users
(нет необходимости добавлять «новый»).Ответ на этот вопрос зависит от того, хотите ли вы разрешить клиенту изменить идентификатор?
Если клиент может изменить идентификатор через PUT, то URI для ресурса изменится, и вы должны предоставить 301 Moved Permanently каждый раз, когда ресурс обращается к старому URI.
Так, например, вы начинаете с ресурса в
и клиент помещает следующее на ресурс
ресурс обновлен, и теперь его URI
Location
Поле в ответ PUT должен содержать новый URI, и если вы идете/users/123
вы должны получить301
ответ с полем Расположение указывает на новый/users/222
ресурс.В большинстве случаев, хотя вы на самом деле не хотите, чтобы клиент мог изменять идентификатор, так как это может довольно быстро запутаться. В этом случае идентификатор может изменить только сервер, и вы должны оставить его вне тела PUT, так как клиент не может обновить это состояние.
Если вы помещаете требование в другой URI на том же ресурсе, скажем,
тогда, если этот ресурс не существует, сервер должен создать его и создать и ID, когда он это делает
источник