Я реализую веб-службу RESTful, которая обращается к базе данных. Объекты в базе данных имеют версии для обнаружения нескольких обновлений Например, если текущее значение {"name": "Bill", "comment": "tinker", "version": 3}
, если PUT одного пользователя {"name": "Bill", "comment": "tailor", "version": 3}
, запрос будет успешным (200 OK) и запрос новое значение будет {"name": "Bill", "comment": "tailor", "version": 4}
. Если второй пользователь помещает {"name": "Bill", "comment": "sailor", "version": 3 "}
, этот запрос не будет выполнен (конфликт 409), поскольку номер версии не совпадает .
Существуют интерфейсы без RESTful, поэтому дизайн баз данных изменить нельзя. Интерфейс RESTful вызывает существующий интерфейс, который обрабатывает детали проверки версии.
В веб-службах RESTful действует правило следовать подробностям HTTP, когда это возможно. Было бы лучше в этом случае использовать условный заголовок в запросе и вернуть 412 Precondition Failed, если версия не совпадает? Соответствующий заголовок выглядит как If-Match. Этот заголовок принимает ETag (Entity Tag), который может быть хешем представления текущего состояния ресурса.
Если бы я сделал это, ETags были бы для внешнего вида, потому что версия все равно была бы реальной что я проверяю.
Есть ли какая-то причина, по которой я должен это делать, кроме как «сделать его более RESTful», что бы это ни значило?