Я разрабатываю RESTful API, в котором http://server/thingyapi/thingyblob/1234
для загрузки возвращает файл (он же «blob»), связанный с thingy # 1234. Но может случиться так, что запрос сделан в то время, когда файл не существует на сервере, но наиболее определенно будет доступен позже. На сервере есть пакетный процесс, который генерирует все BLOB-объекты для всех штук. Thingy 1234 уже существует, и его данные, кроме блоба, уже доступны. Серверу еще не удалось сгенерировать BLOB-объект штуковины 1234 года.
Я не хочу возвращать 404; это для штуковин, которых не существует. Это вещь, которая существует, но ее блоб еще не сгенерирован. Вроде как видео на YouTube это "обработка". Я не думаю, что коды перенаправления были бы правильными; нет «другого» URL, чтобы попробовать.
Какой правильный код статуса HTTP нужно вернуть в таком случае?
204
"Нет контента"? Is указывает, что сервер успешно обработал запрос и не возвращает никакого содержимого [в настоящее время].Ответы:
Я предлагаю
202 - Accepted
. Из документации :источник
«Проблема», как она есть, на стороне сервера: клиент сделал правильно сформированный запрос, но сервер не может удовлетворить его. Так что я склонен к «Ошибка сервера», код состояния 5xx.
Quoth RFC 7231 (текущий стандарт HTTP, акцент добавлен):
Заметка
Из доступных кодов, я бы сказал, 503, «Служба недоступна» как нельзя лучше подходит:
Примечание:
Retry-After
значение. В качестве значения можно указать предполагаемое время завершения следующего выполнения пакетного процесса или интервал выполнения пакетного процесса.Определение собственного кода статуса 5xx (например, 591), хотя и разрешено , будет иметь неверную семантику:
Клиенты будут рассматривать ваш собственный код состояния как 500, «Внутренняя ошибка сервера» , что было бы неправильно.
источник
307 - TEMPORARY REDIRECT
полезен, если вы хотите заставить клиентскую сторону ждать в другом месте, пока ваш ресурс «готовится»Я думаю, что 423 - Locked можно использовать для этой цели:
источник
URL не соответствует запросу на штуку.
http://server/thingyapi/thingyblob/1234
Клиент запрашивает штуковину, которой не существует. Если бы он существовал, вы бы дали его им.
404.
источник
503
это правильным ответом. Не говоря уже о некоторых других странных предложениях.Другой вариант:
503 - Service Unavailable
.источник
Поскольку ваш ресурс не готов, вы, вероятно, знаете, когда (приблизительно) он будет доступен и когда клиент может повторить свой запрос. Это означает, что вы можете использовать заголовок Retry-After . Этот заголовок действителен с 503 (служба недоступна), что означает, что весь сайт не работает для обслуживания, и с ответами 3xx (перенаправление).
По моему мнению, 302 (найдено) с заголовком Retry-After будет лучшим вариантом, но я не уверен, может ли поле Location заголовка ответа быть равно URL запроса. В любом случае, это круговое перенаправление.
источник
409 Конфликт
Указывает, что запрос не может быть обработан из-за конфликта в запросе, такого как конфликт редактирования в случае нескольких обновлений. [Источник Википедии.]
Это может быть уместно.
Если вы не можете выполнить запрос, вернув данные - это не удача. Я думаю, что 202 предполагает, что сервер поставил в очередь запрос, и он выполнит запрос позже. Но в вашем случае запрос для данных сейчас и не удалось. Если вы повторите попытку позже, это другой запрос.
Я думаю, что у вас есть конфликт .. вы хотите данные .. но они редактируются / обновляются. Это также имело бы место, если Thingy1234 уже существовал и был успешно загружен ранее, но сейчас находился в процессе редактирования, был недоступен во время редактирования.
источник
501 - не реализовано
Точно так же, как это звучит. Функция, которая еще не реализована, но подразумевает доступность в будущем.
Вот ссылка на резюме ошибок 5xx .
источник