Это довольно распространенное требование для поддержки отказов или отложенных/пакетных удалений для служб данных. Мне интересно, как реализовать это с помощью RESTful. Я разрывается между несколькими разными вариантами (ни одна из них не кажется мне ужасно привлекательной). Я полагаю, что общий для этих разных вариантов - это потребность в API, который возвращает весь ресурс, помеченный как удаленный для определенного типа ресурса.
Вот некоторые варианты, о которых я думал, и некоторые из их плюсов и минусов:
Параметры для отметки ресурса как удаленные:
- Используйте HTTP DELETE, чтобы пометить ресурс как удаленный.
- Используйте HTTP PUT/POST для обновления удаленного флага. Это не кажется правильным, поскольку он отображает то, что по сути является удалением от метода DELETE HTTP и других методов HTTP.
Параметры, когда GET-ресурс помечен для удаления:
- Возвращает статус HTTP 404 для ресурса, помеченного как удаленный. Чистое и прозрачное, но как мы говорим о разнице между действительно удаленным ресурсом или только что помеченным как удаленное.
- Возврат HTTP-статуса 410. Предоставляет способ сказать разницу, но 410 технически говорит, что "ожидается, что он будет считаться постоянным. Клиенты с возможностями редактирования ссылок ДОЛЖНЫ удалять ссылки на Request-URI после утверждения пользователем". Там может быть достаточно места для маневра в словах "ожидаемый" и "СЛЕДУЕТ" здесь. Не уверен, насколько хорошо 410 поддерживается/понимается там в клиентах.
- Возвращает статус HTTP 200 и включает в себя флаг, указывающий, что ресурс удаляется. Это кажется странным, поскольку идея удалить его в первую очередь была потому, что вы на самом деле хотели, чтобы он не появлялся. Это подталкивает ответственность за фильтрацию удаленных ресурсов до клиентов.
Параметры ответов, которые включают этот удаленный ресурс:
- Опустить ресурсы, созданные как удаленные. Чистый и простой. Но что, если вы действительно хотите узнать об удаленных ресурсах.
- Включите их вместе с полем, указывающим, что они удалены. Это подталкивает ответственность за фильтрацию удаленных ресурсов до клиентов. Это делает сложную разбивку на страницы, если вы хотите показывать только страницы с помощью активных или удаленных ресурсов.
Параметры при обновлении ресурса, помеченного для удаления:
- Использовать HTTP-статус 404. Ресурс пропал? Но как вы можете определить разницу между ресурсом, помеченным как удаленным, и фактически удаленным. Тело HTTP в ответе 404 может быть здесь неоднозначным, но тогда клиенты остаются в синтаксическом анализе или интерпретации вашего тела для устранения неоднозначности. Может быть, заголовок ответа может помочь здесь? Который из? Пользовательский заголовок?
- Используйте HTTP-статус 409 с сообщением о том, как ресурс должен быть сначала восстановлен.
Параметры для восстановления ресурса, помеченного для удаления:
- Используйте HTTP PUT/POST для обновления работы ресурса и снова отмечайте его. Это работает только до тех пор, пока вы не возвращаете HTTP 404 для операции GET для ресурса, так как он не делает с PUT/POST ресурсу, который "не найден" (404).
- Используйте HTTP PUT/POST для создания ресурса. Проблема в том, какие данные имеют приоритет? Данные, отправленные в операции создания? Или данные, которые восстанавливаются? отфильтруйте его из любых других запросов, которые вернули бы его. Затем обработайте HTTP PUT/POST, который создает ресурс как undelete, если идентификатор ресурса указывает на ресурс, помеченный как удаленный.
- Отдельный путь REST, предназначенный для восстановления ресурсов, помеченных для удаления.
Это далеко не полный список. Я просто хотел перечислить некоторые варианты, которые подпрыгивали у меня в голове.
Я знаю, что ответ на вопрос, как это сделать, как обычно, "это зависит". Что мне интересно, какова квалификация/требования, которые вы будете использовать для принятия решения? Как вы видели, как это реализовано или реализовано самостоятельно?