В настоящее время в моей команде идет обсуждение, и мне было бы интересно узнать другие точки зрения. Предположим, у нас есть веб-служба RESTful, роль которой заключается в аннотировании документов с применением различных алгоритмов и служб анализа. Основное взаимодействие понятно: у нас есть ресурс, который представляет собой коллекцию документов; клиент отправляет новый документ в коллекцию, возвращает URI нового документа, а затем может ПОЛУЧИТЬ этот docURI для возврата документа или ПОЛУЧИТЬ {docURI}/metadata для просмотра общих метаданных, {docURI}/ne для именованных сущностей и т. д. Проблема в том, что некоторые выполнение анализов может занять много времени. Предположим, что клиент ПОЛУЧАЕТ URI метаданных до завершения анализа, потому что он хочет иметь возможность отображать частичные или добавочные результаты в пользовательском интерфейсе. Повторение GET в будущем может дать больше результатов.
Решения, которые мы обсуждали, включают:
- сохранение HTTP-соединения открытым до тех пор, пока не будут выполнены все анализы (что не кажется масштабируемым)
- использование заголовков
content-lengthиaccept-rangeдля получения добавочного контента (но мы не знаем заранее, какой длины будет окончательный контент) - предоставление канала Atom для каждого ресурса, чтобы клиент подписывался на события обновления, а не просто ПОЛУЧАЛ ресурс (кажется слишком сложным и, возможно, ресурсоемким, если есть много активных документов)
- просто GET возвращает все, что доступно в данный момент (но это по-прежнему оставляет проблему того, что клиент узнает, когда мы, наконец, закончим) [отредактировано для удаления ссылки на идемпотентность после комментариев].
Любые мнения или предложения по альтернативным способам обработки долгоживущих или асинхронных взаимодействий в архитектуре RESTful?
Ян
GET, верните все метаданные, которые у вас есть на тот момент, установите заголовок времени жизни кеша на ноль, если эти данные все еще генерируются. Комплексное решение: используйте push для отправки метаданных клиентам по мере их создания ... imo грязно, лаваш, не стоит. ИспользуйтеGET. - person thecoshman   schedule 23.07.2015