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