HTTP-статус 412 (Сбой предварительного условия) и управление версиями базы данных

Я реализую веб-службу 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», что бы это ни значило?

11
задан Charles 20 March 2013 в 22:46
поделиться