200 — это хорошо или это плохо? / Хабр
В этой трехминутной статье я хочу затронуть наболевшую тему.
Речь пойдет о статус коде HTTP 200 и ошибках в ответе.
HTTP/1.1 200 OK { "error": { code: 2019, message: "Validation failed: field 'size' is invalid: the value is not a number" } }
Нормально ли возвращать такой код, если возникла ошибка?
Нет? Да? Ну-ка давайте разберемся.
Случай 1. HTTP 200 и batch операция
Допустим отправляется один запрос. Запрос выполняется успешно. Возвращаем код 200. Ответ не содержит информации об ошибке. С этим случаем всё предельно просто и понятно. А что делать если требуется выполнить batch операцию?
Например, мы работаем с сервером изображений. Предоставляемый API позволяет загрузить за один запрос сразу несколько файлов.
Запрос выглядит примерно так:
{ "sources": [ {"image": "http://myserver. com/image1.jpg"}, {"image": "http://myserver.com/image2.jpg"}, {"video": "http://myserver.com/video.jpg"} ] }
Предположим, по какой-то причине (например, кончилось место на сервере) видео загрузить не удалось. Что бы вы вернули в таком случае? 2xx или 4xx или 5xx? Сервер, отвечает примерно вот так:
HTTP/1.1 200 OK { "results": [ { "status": "ok", "id": 312 }, { "status": "ok", "id": 313 }, { "status": "fail", "error": "NO SPACE" } ] }
Некоторые сервисы (и вполне известные) действуют также. Отвечают 200. А в ответе возвращают список команд, которые выполнить не получилось.
Случай 2. HTTP 200 и ошибки в ответе
Где-то на просторах интернета я встречал проекты на github и bitbucket, которые специально предназначены для таких вот случаев. В них просто вшиты возможные варианты и шаблоны. Можно их достаточно легко встроить в свой проект и как бы быть готовым к разного рода «падениям» запросов. Но есть одно но.
В такие моменты твой код становится уродливым. Ты ему говоришь:
— Cлушай, у нас тут есть один внешний API. Он в целом нормальный. Только надо внимательно смотреть что в ответе приходит. Если там ответ содержит поле «error», то значит запрос сломался.
— Тише-тише. Не надо так громко. Он может услышать. Пожалуйста, будь добрее к нему. И просто смотри не только на статус код, но и на ответ, пожалуйста.
— Ладно…
HTTP 200 — это просто статус
Ну 200 и 200. Ну не запилили. Или не успели. Или вообще не будут. Ну и что?! Написал json парсер и всё!
Как бы да, но я хочу знать почему. Забыли? Забили? Не успели? Не знали?
Возможно я что-то упускаю. Или не знаю.
Измельчитель пищевых отходов STATUS NEXT 200 Compact
- Компактный корпус устройства с выносным блоком управления для оптимизации пространства под мойкой
- Тихий, компактный, лёгкий и высокомоментный бесщеточный BLDC двигатель
- Автоматический реверс
- Шумоизоляция измельчительной камеры и двигателя
- Три ступени измельчения
- Система защиты от перегрузки и заклинивания
- Гарантия 5 лет
- Блок управления
- Пневмовыключатель (выключатель, шланг, 2 сменные цветовые панели)
- Фильтрующая сетка с резиновой пробкой
- Монтажный узел
- Сливная труба с пружинным хомутом
NEXT 200 Compact — новый компактный измельчитель пищевых отходов. Примененная комбинация из инновационного бесщеточного BLDC двигателя и выносного блока управления позволили снизить высоту устройства до 22 см без потери производительности измельчения и снизить нагрузку на мойку. При использовании NEXT 200 Compact в стандартных габаритах подмоечного пространства вам доступен дополнительный объем для организации системы хранения или установки мусорного ведра.
Комплектация
Камера | пластик+стекловолокно |
Объем камеры, мл | 1050 |
Скорость вращения диска, об/мин | 2200 |
Тип двигателя | бесщеточный постоянного тока (BLDC) |
Мощность двигателя, л.с. | 0,75 |
Потребляемая мощность, Вт/час | 560 |
Напряжение, В | 220 |
Способ переработки | проточный |
Пневмокнопка | да |
Диск | нержавеющая сталь |
Сливной фланец | нержавеющая сталь |
Защита от перегрузок | да |
Реверс | да |
Фильтрующая сетка | да |
Крышка толкатель | нет |
Усилитель мощности | нет |
Высота, мм | 224 |
Диаметр, мм | 210 |
Вес, кг | 5 |
Гарантия, лет | 5 |
Ваше имя:
Ваш отзыв:
Примечание: HTML разметка не поддерживается! Используйте обычный текст.
Оценка: Плохо Хорошо
Защита от роботовВведите код в поле ниже
Коды состояния в HTTP
Коды состояния в HTTP1992 г.
Это исторический документ, и он уже не точен. Для актуальную информацию о спецификации HTTP см. в последней черновики HTTP/1.1
Значения числового кода состояния для HTTP-запросы выглядят следующим образом. Данные разделы сообщений Error, Forward и redirection ответы могут быть использованы содержать удобочитаемую диагностическую информацию.
Успех 2xx
Эти коды указывают на успех. Раздел body, если он присутствует, является возвращаемым объектом. по запросу. Это объект формата MIME. Он имеет формат MIME и может быть только в формате text/plain, text/html или в одном из форматов, указанных как допустимые в запросе.
ОК 200
Просьба была выполнена.
СОЗДАН 201
После команды POST это указывает на успех, но текстовая часть в строке ответа указывается URI, по которому вновь созданный документ должен быть известным.
Принято 202
Заявка принята в обработку, но обработка еще не завершена. было завершено. Запрос может быть, а может и не быть выполнен в конечном итоге, поскольку он могут быть запрещены, когда обработка действительно имеет место. нет возможности для возврата состояния из асинхронных операций, таких как эта.
Частичная информация 203
При получении в ответ на команду GET это указывает на то, что возвращаемый метаинформация не является окончательным набором объекта с сервера с копия объекта, но из частной наложенной сети. Это может включать аннотационная информация об объекте, например.
Нет ответа 204
Сервер получил запрос, но нет информации для отправки обратно, и клиент должен оставаться в том же представлении документа. В основном это позволяет ввод для скриптов без одновременного изменения документа.
Ошибка 4хх, 5хх
Коды 4xx предназначены для случаев, когда клиент, похоже, ошибся, и коды 5xx для случаев, когда сервер знает, что сервер ошибся. Различить эти случаи в общем случае невозможно, поэтому разница только информационная.
Раздел body может содержать документ, описывающий ошибку в удобочитаемом виде. форма. Документ находится в формате MIME формате и может быть только в формате text/plain, text/html или одном из указанных форматов. как допустимо в запросе.
Неверный запрос 400
Запрос имел неправильный синтаксис или был невозможен по своей сути.
Неавторизованный 401
Параметр этого сообщения дает спецификацию схем авторизации. которые приемлемы. Клиент должен повторить запрос с подходящим Заголовок авторизации.
PaymentRequired 402
Параметр этого сообщения дает спецификацию схем тарификации. приемлемый. Клиент может повторить запрос с подходящим заголовком ChargeTo.
Запрещено 403
Запрос касается чего-то запретного. Авторизация не поможет.
Не найдено 404
Сервер не нашел ничего, соответствующего указанному URI
Внутренняя ошибка 500
Сервер столкнулся с непредвиденным условием, которое помешало ему выполнить запрос.
Не реализовано 501
Сервер не поддерживает необходимое средство.
Сервис временно перегружен 502 (БУДЕТ ОБСУЖДАТЬСЯ)
Сервер не может обработать запрос из-за высокой нагрузки (будь то HTTP-обслуживание или другие пожелания). Подразумевается, что это временное состояние который может быть смягчен в другое время.
Тайм-аут шлюза 503 (БУДЕТ ОБСУЖДАТЬСЯ)
Это эквивалентно внутренней ошибке 500, но в случае сервера, который в свою очередь обращается к какой-либо другой службе, это указывает на то, что ответ из другой службы не вернулся в течение времени, когда шлюз был готов ждать. Как с точки зрения клиента и HTTP-транзакции другая служба скрыта на сервере, это может рассматриваться одинаково до Internal error 500, но имеет больше диагностическое значение.
Примечание: Коды 502 и 503 являются новыми и обсуждаются, сентябрь 19, 1994
Коды в этом разделе указывают на действие, которое необходимо предпринять (обычно автоматически). клиентом для выполнения запроса.
Перемещено 301
Запрошенным данным присвоен новый URI, изменение является постоянным. (N.B. это оптимизация, которая должна быть прагматически включена в это определение. Браузеры с возможностью редактирования ссылок должны автоматически ссылка на новую ссылку, где это возможно)
Ответ содержит одну или несколько строк заголовка вида
URI:Строка CrLf
Которые указывают альтернативные адреса для рассматриваемого объекта. Строка необязательное поле комментария. Если ответ должен указать набор вариантов каждый из которых соответствует запрошенному URI, то составная/альтернативная упаковка может использоваться для различения различных наборов
Найдено 302
Запрошенные данные фактически находятся по другому URL-адресу, однако перенаправление может быть иногда изменено (при размещении ссылок на такие виды документа браузер должен по умолчанию использовать Udi перенаправления документ, но есть возможность ссылки на окончательный документ) как для «Вперед».
Формат ответа такой же, как и для Moved .
Метод 303
Метод: <метод>часть тела
Примечание: Этот код состояния необходимо указать более подробно. Для пока только для обсуждения.
Как и найденный ответ, это говорит о том, что клиент должен попробовать другую сеть. адрес. В этом случае вместо GET можно использовать и другой метод.
Раздел body содержит параметры, которые будут использоваться для метода. Этот позволяет документу быть указателем на сложную операцию запроса.
Перед телом могут стоять следующие дополнительные поля как указано.
Не изменено 304
Если клиент выполнил условный GET и доступ разрешен, но документ не изменялся с даты и времени, указанных в Если-Изменено-С поле, сервер отвечает кодом состояния 304 и не отправляет документ тело клиенту.
Заголовки ответа такие же, как если бы клиент отправил запрос HEAD, но с ограничениями. только те заголовки, которые имеют смысл в этом контексте. Это означает, что только заголовки которые имеют отношение к менеджерам кеша и которые могли измениться независимо даты последнего изменения документа. Примеры включают Date , Server и Истекает .
Цель этой функции — обеспечить эффективное обновление локального кеша. информации (включая соответствующую метаинформацию), не требуя накладных расходов нескольких HTTP-запросов (например, HEAD, за которым следует GET) и минимизировать передача информации, уже известной запрашивающему клиенту (обычно кеширующий прокси).
Состояние HTTP 200 (ОК)
Последнее обновление:
Автор: Lokesh GuptaКод состояния 0132 (ОК) указывает, что запрос был успешно обработан на сервере. Полезная нагрузка ответа зависит от метода HTTP, который был выбран для запроса.
1. Ответ объект
HTTP Метод | Ответ. |
---|---|
HEAD | Ответ содержит только поля заголовка HTTP, и в ответ не отправляется полезная нагрузка . |
POST | Ответ обычно содержит информацию о прогрессе представления статуса или результате действия , которое было выполнено в запросе. |
PUT | Представление состояния выполнения запроса отправляется в ответ. |
УДАЛИТЬ | Представление состояния выполнения запроса отправляется в ответ. |
ОПЦИИ | Список допустимых методов запроса, связанных с ресурсом с использованием заголовка Allow . например Разрешить: HEAD, GET, OPTIONS |
TRACE | Представление сообщения о завершении запроса сервера. |
2. Важные факты
- Ответ 200 всегда содержит полезную нагрузку , хотя исходный сервер МОЖЕТ генерировать тело полезной нагрузки нулевой длины или пустую полезную нагрузку.
- Если сервер не хочет отправлять какую-либо полезную нагрузку в ответ, вместо этого он должен отправить HTTP-статус 204 (Нет контента).