Как использовать ETag/If-Match с несколькими элементами

Рекомендуемым способом обработки оптимистической блокировки в интерфейсе RESTful является возврат ETag из GET и поставка If-Match на PUT, то есть:

GET /items/1  --> gives client an ETag for a single item
PUT /items/1  <-- client gives it back as If-Match for checking

Как использовать эту схему с несколькими элементами, например, если я хочу, чтобы пакетный набор нескольких элементов из одного URI:

GET /items    --> How do I return multiple ETags for multiple items here? 

Альтернативно, если ETags/If-Match не справляются с этой ситуацией, какой рекомендуемый подход? Или я должен просто свернуть свой?

Ответ 1

tl; dr: это нормально, чтобы назначить etags ресурсу, который содержит "коллекцию", но это зависит от приложения для управления идентификацией/изменением элементов в этой коллекции при определении действительный etag.

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

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