Следует ли изменить обновленную метку времени для вызова PUT с теми же данными?

У нас есть Restful API. В ответе PUT API мы обновляем столбец обновленной временной метки в базе данных текущим временем и возвращаем его значение как часть «обновленного» поля временной метки в ответе json.

Мой вопрос: если ни одно из полей в объекте не обновляется при вызове PUT, следует ли изменить обновленную временную метку или нет?

Чтобы уточнить, при выполнении одного и того же вызова PUT несколько раз без изменения данных объекта должна ли изменяться обновленная временная метка?

Есть ли передовой опыт?

Поскольку вы попадаете в одно и то же состояние после PUT, независимо от того, сколько раз вы его запускаете, говорят, что оно «одинаково мощное», то есть каждый раз - идемпотентное. Соглашаясь с @felipe-zavan, нет смысла обновлять временную метку, если ваш звонок PUT — это тот же запрос.

Dev-vruper 17.12.2020 12:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
879
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Спецификация HTTP указывает, что запрос PUT должен получить полное представление ресурса и либо создать его, если он не существует (и ответить со статусом 201 Created и пустым телом), либо полностью заменить его, если он существует (и ответьте статусом 200 OK или 204 No Content и пустым телом). Это (почти) все. Большинство API, конечно же, игнорируют часть «тело не должно быть возвращено».

«Обновленную» временную метку следует рассматривать не как часть ресурса, а скорее как метаданные о ресурсе, и ее обновление следует рассматривать как побочный эффект запроса, который выходит за рамки спецификации, и поэтому вы можете обрабатывать однако вы считаете, что это подходит для вашего варианта использования.

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

Например, Ruby on Rails не обновляет временную метку updated_at, если никакие атрибуты модели не изменились.

Я бы сказал, что дата обновления должна отражать то, что произошло на самом деле. Если вы действительно обновили запись (например, выполнили реальный вызов UPDATE базы данных), измените метку времени. Если вы на самом деле ничего не делали (например, просто сравнивали значения и ничего не делали), НЕ изменяйте дату обновления. Это сэкономит вам много времени, если запросы, которые вы считаете идентичными, на самом деле не являются таковыми. Кроме того, как упоминалось выше, возврат обновленных временных меток не является полностью семантически правильным, лучше использовать заголовки (например, Last-Modified).

Другие вопросы по теме