REST: Должна ли конечная точка PUT сравнивать ответ GET перед обновлением? - PullRequest
0 голосов
/ 19 сентября 2018

Я разрабатываю REST API при загрузке Spring и пытаюсь понять действие PUT.В настоящее время мое действие PUT берет идентификатор объекта и проверяет, присутствует ли объект, а затем заменяет объект новым.У меня есть следующие вопросы.

  1. Должен ли я сравнивать старый объект с новым перед сохранением нового, чтобы узнать, изменился ли вообще новый объект, и вернуть статус ответа http, если объект не изменился?
  2. Если я хочу сравнить, как лучше узнать, действительно ли изменен объект или нет

Спасибо.

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

REST: должна ли конечная точка PUT сравнивать ответ GET перед обновлением?

Ни REST, ни HTTP не накладывают каких-либо особых ограничений на реализацию - ограничена только семантика. RFC 7231

HTTP не определяет точно, как метод PUT влияет на состояние исходного сервера, помимо того, что может быть выражено намерением запроса пользовательского агента и семантикойответ исходного сервера .... Вообще говоря, все детали реализации за интерфейсом ресурсов преднамеренно скрыты сервером.

RFC 7232 может иметь представление о том, кто выищите

Исходный сервер НЕ ДОЛЖЕН выполнять запрошенный метод, если полученное условие If-Match оценивается как ложное;вместо этого сервер происхождения ДОЛЖЕН ответить либо а) кодом состояния 412 (Не выполнено предварительное условие), либо б) одним из кодов состояния 2xx (Успешно), если сервер источника подтвердил, что запрашивается изменение состояния, а окончательное состояние ужеотражено в текущем состоянии целевого ресурса (т. е. изменение, запрошенное пользовательским агентом, уже успешно выполнено, но пользовательский агент может не знать об этом, возможно, из-за того, что предыдущий ответ был потерян или совместимое изменение было сделано каким-то другимuser agent).

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

Если я хочу сравнить, как лучше узнать, действительно ли объект был изменен или нет

Недостаточно информации.Это будет зависеть от того, как исходный сервер хранит состояние ресурса.Если вы имеете дело только с необработанными документами, то сравнение двух длинных ключей хеша может быть вполне подходящим.

0 голосов
/ 19 сентября 2018

Нет, вам не нужно сравнивать вообще.PUT означает, что вам нужно заменить все значения новыми, но если вам нужно сохранить созданные или созданные свойства времени, вы должны получить запись из базы данных и обновить необходимые значения из предыдущей записи в новую.

Если вам нужно сравнить два объекта, вам нужно переопределить метод равным и hashCode.Затем вы можете проверить a.equal (b), чтобы проверить, изменились ли значения.Имейте в виду, если объект содержит данные времени или случайные числа генерации, избегайте добавления их внутри равного метода.

PATCH - это место, где вам нужно получить текущую запись из БД и обновить соответствующие значения.

0 голосов
/ 19 сентября 2018

Вы можете выбрать между PUT или PATCH, не все протоколы поддерживают PATCH.

Когда клиенту необходимо полностью заменить существующий ресурс, он может использовать PUT.Когда они выполняют частичное обновление, они могут использовать HTTP PATCH.

, если вы используете PUT, вам нужно все сравнить и проверить, например:

  1. Получить объект из БД

  2. проверить и обновить любой обновленный бизнес-объект

  3. , затем сохранить.Чтобы ответить на ваш вопрос, объект изменен, вам не нужно сравнивать значение из существующего объекта и нового объекта.

, но если на стороне клиента можно отправить только обновленные свойства, лучше использовать PATCH.

, чтобы узнать больше и узнать, как это можно реализовать, ведите блог

HTTP PUT против HTTP PATCH в API REST

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