Когда ставится с идентификатором в URL и в теле, кто выигрывает? - PullRequest
0 голосов
/ 12 декабря 2018

Попытка выяснить правильное поведение покоя в следующем случае:

  • существует конечная точка / objects / {id} с методами GET и PUT
  • объекты могутбыть произвольным json, и по какой-то причине у них есть собственный идентификатор в качестве ключа, например, {"id": 1}
  • на GET /objects/1 Я, очевидно, должен оживить {"id": 1}
  • Что происходит, когда я PUT /objects/1 {"id": 2}?

Это варианты, которые мне нравятся в нисходящем порядке:

  • Состояние Not-OK при PUTting - сигнализировать о конфликте и не разрешать PUT
  • Не включайте id в объект в первую очередь. Проблема: Мои объекты могут быть действительно сложными и иметь идентификатор, вплетенный в их вложенную структуру, что затрудняет фильтрацию / повторное включение
  • URL-идентификатор выигрывает (игнорируя идентификатор тела). Проблема: Когда снова ПОЛУЧАЕТЕ, я не получаю то, что Я ПОСТАВИЛ, но что-то еще
  • побеждает тело. Проблема: То, что я положил, полностью заканчивается где-то еще

1 Ответ

0 голосов
/ 13 декабря 2018

RFC 7231

Успешное PUT данного представления предполагает, что последующее GET на том же целевом ресурсе приведет к отправке эквивалентного представления в 200 (OK) ответ.

Идентификатор ресурса и его представление не обязаны согласовываться каким-либо семантически значимым образом, во многом так же, как не требуется согласовывать полный путь к файлус его содержимым, почти так же, как значение в словаре не требуется для согласования с его ключом.

GET /objects/1

200 OK

{ "id": 2 }

Что касается HTTP, то это совершенно верно, так же, как это было бы для

GET /fbb477c8-e2f3-4581-9c44-27305de6ebee

200 OK

{ "id": 2 }

Ключевой элемент стандарта, на который нужно опираться, заключается в следующем:

Исходный сервер ДОЛЖЕН проверить соответствие представления PUT любым ограничениям, которые имеет сервердля целевого ресурса, который не может или не будет изменен PUT.

В правилах сказано, чтоt любое представление от PUT до /fbb477c8-e2f3-4581-9c44-27305de6ebee должно составлять около id:1 и отклонять как несогласованные запросы, которые не удовлетворяют этому инварианту. 409 Конфликт - это обычный код состояния, используемый в этом случае.

И, конечно, это в равной степени относится к идентификатору /objects/1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...