Различные URI для PATCH против PUT при смене Uri Slug - PullRequest
0 голосов
/ 25 апреля 2019

В правильной реализации REST API представьте, что я пишу API, чтобы позволить пользователю изменить URI-слаг, например, изменить /acme/first на /acme/second.

В зависимости от того, отправляю ли ячастичная запись (patch) или вся запись (put), которая в настоящее время представляет first, должен ли изменяться uri?

Например:

PUT /acme/second
{ [...], "current-slug": "first", "color": "blue" }

Положить против new uri, потому что put означает «это идет сюда».

против

PATCH /acme/first
{ "new-slug": "second", "color": "blue" }

Патч против старого uri, потому что patch означает «изменить то, что здесь».

Я подозреваю, что это крайний случай, но интересный, потому что фактически вся документация показывает один и тот же uri для действия put против patch,хотя, очевидно, post - это вообще другое URI.

1 Ответ

1 голос
/ 25 апреля 2019

Это определенно немного крайний случай.Одним из очевидных HTTP-методов для этого является метод HTTP MOVE.Этот метод взят из WebDAV, но он должен работать везде.

MOVE /acme/first HTTP/1.1
Destination: /acme/second

Это была бы моя главная рекомендация, потому что он так хорошо подходит к проблеме.

Что странно с либо PATCH или PUT заключается в том, что они оба ожидают обновления ресурса в целевом uri , но результат операции больше похож на DELETE, поскольку он удаляет ресурс (исоздает новый в другом месте).

Из-за этого я был бы склонен предложить не использовать ни для этого случая.Этого достаточно для крайнего случая, чтобы оправдать специальный запрос POST.

Но да ... MOVE идеально.Любой HTTP-клиент или сервер, который не понимает семантику MOVE, должен обращаться с ней подобно POST (небезопасно, не идемпотентно).

...