Правильный код состояния HTTP для использования в запросе помимо известных данных

Я определяю API и столкнулся с вопросом, с которым мне раньше не приходилось сталкиваться. Мне было интересно, каков будет консенсус в отношении лучшего кода состояния для ответа, когда результат неизвестен (пока).

Чтобы объяснить, рассматриваемая конечная точка GET не возвращает ресурс, это просто инструмент для возврата конкретной информации об известных датах.

Данные внутреннего календаря, которые он использует для этого, периодически загружаются вручную частями. Итак, если пользователь делает запрос на дату, которая выходит за пределы (или предшествует) загруженному диапазону дат, как должен реагировать API?

Первоначально я думал об ошибке 4xx, но синтаксис и запрос технически действительны. Попытка точно такого же запроса в другое время (когда данные для этой даты уже загружены) приведет к успешному ответу.

Глядя на ошибки 5xx, non кажется идеальным совпадением. 503 Служба недоступна выглядит ближе всего ко мне, но, похоже, сосредоточена на временных ошибках. Эта ситуация может длиться в течение месяцев потенциально. Сложная проблема заключается в том, что сам API не знает, когда будут загружены дополнительные данные, поэтому мы также не можем легко использовать заголовок Retry-After.

Чтобы ты делал? Спасибо!


person Rob    schedule 18.04.2019    source источник
comment
К manually loaded in chunks periodically я предполагаю, что фоновая задача в вашем интерфейсе постоянно передает новые записи даты из бэкэнда, а запрос, обработанный вашим интерфейсом, просто возвращает записи даты в пределах запрошенного диапазона времени? В таком случае я считаю естественным возвращать только то, что доступно в настоящее время и в пределах запрошенного диапазона времени на момент запроса. Если временной диапазон полностью выходит за пределы любых доступных записей дат, я бы вернул пустой список/набор, чтобы указать, что данные для данного временного диапазона не найдены. Следовательно, 200 OK в порядке   -  person Roman Vottner    schedule 18.04.2019


Ответы (3)


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

Также важно добавить заголовок Location с конечной точкой, обслуживающей фактическое состояние асинхронной операции, чтобы клиент мог отслеживать ее периодически.

person Sereja Bogolubov    schedule 18.04.2019
comment
Если вы уже опрашиваете текущее состояние ресурса, нет необходимости добавлять в ответ дополнительный заголовок Location. Этот заголовок следует использовать только для информирования клиента о том, что в результате полученного запроса был создан дополнительный ресурс, и его содержимое можно просмотреть с помощью данного URI. Однако, поскольку запросы GET безопасны, обработка таких запросов НЕ ДОЛЖНА (ДОЛЖНА?) НЕ создавать дополнительные ресурсы. Поэтому такой заголовок не имеет смысла в ответе на запрос GET. - person Roman Vottner; 18.04.2019
comment
Я думаю, что 204 No Content был бы лучшим выбором. Запрос действителен, но возвращать нечего. - person Brian M Moore; 07.05.2019

Не используйте для этого код состояния HTTP 4xx или 5xx.

Их следует использовать только в том случае, если в запросе или ответе есть ошибка, а ее нет.

Ошибки 4xx означают, что запрос не выполнен (чего не произошло), а 5xx означает ошибку сервера.

Обязательно используйте ответ 2xx, либо 200 OK, либо 202 Accepted.

person Daniel    schedule 18.04.2019

Чтобы объяснить, рассматриваемая конечная точка GET не возвращает ресурс, это просто инструмент для возврата конкретной информации об известных датах.

Это ресурс в смысле REST.

Ключевой абстракцией информации в REST является ресурс. Ресурсом может быть любая информация, которая может быть названа: документ или изображение, временная служба (например, «сегодняшняя погода в Лос-Анджелесе»), набор других ресурсов, невиртуальный объект (например, человек) и т. д. . Другими словами, любое понятие, которое может быть целью авторской гипертекстовой ссылки, должно соответствовать определению ресурса. Ресурс — это концептуальное сопоставление с набором сущностей, а не сущность, которая соответствует сопоставлению в любой конкретный момент времени.

В частности, тот факт, что нечто является ресурсом, никоим образом не зависит от реализации, используемой для обеспечения представления ресурса.

если пользователь делает запрос на дату, которая выходит за пределы (или предшествует) загруженному диапазону дат, как должен реагировать API?

Обычно путем возврата тела сообщения, объясняющего клиенту, в чем заключается проблема, и включения в метаданные кода ответа, указывающего характер ответа на общие компоненты.

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

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

Поэтому вам следует использовать код состояния 404 Not Found.

Код состояния 404 (не найдено) указывает на то, что исходный сервер не нашел текущего представления для целевого ресурса или не желает раскрывать его существование.

404, по сути, является намеком на то, что написание target-uri неверно или что клиент не должен запрашивать этот конкретный ресурс. В любом случае это проблема с запросом, и ее следует обрабатывать таким образом.

Попытка точно такого же запроса в другое время (когда данные для этой даты уже загружены) приведет к успешному ответу.

Обратите внимание, что стандарт HTTP явно указывает на то, что 404 может использоваться в временных условиях:

Код состояния 404 не указывает, является ли это отсутствие представительства временным или постоянным.

person VoiceOfUnreason    schedule 18.04.2019
comment
Использовать ли 200 OK с форматом представления, указывающим на пустое состояние, или возвращать 404 Not Found, является более или менее самостоятельным выбором, поскольку ответы на оба варианта кэшируются по умолчанию, и будущие запросы могут привести к другим результатам. В пользу типичного потока контекста, используемого на веб-страницах, которые отображают прокручиваемый набор результатов (подумайте о записях, которые вы можете пролистывать), я больше за то, чтобы возвращалась страница, в которой говорится, что в БД нет доступных записей или т.п., по сравнению с Страница ошибки 404, которая может создать впечатление, что фактическая ссылка не работает. - person Roman Vottner; 18.04.2019
comment
Спасибо за подробный ответ. Но, подумав об этом сейчас, я согласен с другими авторами, что ответ 2XX немного лучше подходит в данном конкретном случае. - person Rob; 23.04.2019