У нас есть Restful API. В ответе PUT API мы обновляем столбец обновленной временной метки в базе данных текущим временем и возвращаем его значение как часть «обновленного» поля временной метки в ответе json.
Мой вопрос: если ни одно из полей в объекте не обновляется при вызове PUT, следует ли изменить обновленную временную метку или нет?
Чтобы уточнить, при выполнении одного и того же вызова PUT несколько раз без изменения данных объекта должна ли изменяться обновленная временная метка?
Есть ли передовой опыт?
Спецификация HTTP указывает, что запрос PUT
должен получить полное представление ресурса и либо создать его, если он не существует (и ответить со статусом 201 Created
и пустым телом), либо полностью заменить его, если он существует (и ответьте статусом 200 OK
или 204 No Content
и пустым телом). Это (почти) все. Большинство API, конечно же, игнорируют часть «тело не должно быть возвращено».
«Обновленную» временную метку следует рассматривать не как часть ресурса, а скорее как метаданные о ресурсе, и ее обновление следует рассматривать как побочный эффект запроса, который выходит за рамки спецификации, и поэтому вы можете обрабатывать однако вы считаете, что это подходит для вашего варианта использования.
На мой взгляд, его НЕ следует обновлять, потому что эти временные метки обычно используются для целей кэширования, и, поскольку ресурс не был изменен, нет причин делать недействительным какой-либо кеш (также имейте в виду, что PUT
запросы вообще не кэшируются в соответствии со спецификацией ). Другим вариантом использования временной метки может быть показ конечным пользователям последнего изменения ресурса, и в этом случае нет смысла обновлять временную метку, если ничего не изменилось, это просто запутает пользователей.
Например, Ruby on Rails не обновляет временную метку updated_at
, если никакие атрибуты модели не изменились.
Я бы сказал, что дата обновления должна отражать то, что произошло на самом деле.
Если вы действительно обновили запись (например, выполнили реальный вызов UPDATE базы данных), измените метку времени.
Если вы на самом деле ничего не делали (например, просто сравнивали значения и ничего не делали), НЕ изменяйте дату обновления. Это сэкономит вам много времени, если запросы, которые вы считаете идентичными, на самом деле не являются таковыми.
Кроме того, как упоминалось выше, возврат обновленных временных меток не является полностью семантически правильным, лучше использовать заголовки (например, Last-Modified
).
Поскольку вы попадаете в одно и то же состояние после
PUT
, независимо от того, сколько раз вы его запускаете, говорят, что оно «одинаково мощное», то есть каждый раз - идемпотентное. Соглашаясь с @felipe-zavan, нет смысла обновлять временную метку, если ваш звонокPUT
— это тот же запрос.