200
Тьфу ... (309, 400, 403, 409, 415, 422) ... множество ответов, пытающихся угадать, спорить и стандартизировать, какой код возврата является лучшим для успешного HTTP-запроса, но неудачного вызова REST .
Это неправильно смешивать HTTP коды статуса и коды состояния покоя.
Однако я видел много реализаций, смешивающих их, и многие разработчики могут не согласиться со мной.
Коды возврата HTTP связаны с HTTP Request
самим собой. Вызов REST выполняется с использованием запроса протокола передачи гипертекста, и он работает на более низком уровне, чем сам вызванный метод REST. REST - это концепция / подход, а его вывод - бизнес / логический результат, а код результата HTTP - транспорт .
Например, возвращение «404 Не найдено» при вызове / users / вызывает путаницу, поскольку это может означать:
- Неверный URI (HTTP)
- Пользователи не найдены (REST)
«403 Запрещено / Доступ запрещен» может означать:
- Требуется специальное разрешение. Браузеры могут справиться с этим, спросив пользователя / пароль. (HTTP),
- Неправильные разрешения доступа настроены на сервере. (HTTP),
- Вам необходимо пройти проверку подлинности (REST)
И этот список может продолжаться с «500 Server error» (ошибка в HTTP-запросе Apache / Nginx или ошибка бизнес-ограничения в REST) или другими ошибками HTTP и т. Д.
Из кода трудно понять, что было причиной сбоя, HTTP (транспортный) сбой или REST (логический) сбой.
Если HTTP-запрос физически выполнен успешно, он всегда должен возвращать 200 кодов, независимо от того, найдены записи или нет. Потому что ресурс URI найден и обработан сервером HTTP. Да, он может вернуть пустой набор. Можно ли получить пустую веб-страницу с 200 как результат HTTP, верно?
Вместо этого вы можете вернуть 200 HTTP-код с некоторыми опциями:
- «ошибка» объекта в JSON, если что-то пойдет не так
- Пустой массив / объект JSON, если запись не найдена
- Флаг результата / успеха bool в сочетании с предыдущими опциями для лучшей обработки.
Кроме того, некоторые интернет-провайдеры могут перехватить ваши запросы и вернуть вам код HTTP 404. Это не означает, что ваши данные не найдены, но что-то не так на транспортном уровне.
Из вики :
В июле 2004 года британский телекоммуникационный провайдер BT Group развернул систему блокировки контента Cleanfeed, которая возвращает ошибку 404 при любом запросе контента, который, по мнению Internet Watch Foundation, считается потенциально незаконным. Другие Интернет-провайдеры возвращают ошибку HTTP 403 «Запрещено» при тех же обстоятельствах. Практика использования фальшивых ошибок 404 в качестве средства сокрытия цензуры была также отмечена в Таиланде и Тунисе. В Тунисе, где цензура была жестокой до революции 2011 года, люди узнали о природе фальшивых ошибок 404 и создали воображаемого персонажа по имени «Аммар 404», который представляет «невидимого цензора».
Почему бы просто не ответить чем-то вроде этого?
{
"result": false,
"error": {"code": 102, "message": "Validation failed: Wrong NAME."}
}
Google всегда возвращает 200 в качестве кода состояния в своем API геокодирования, даже если запрос логически не выполняется: https://developers.google.com/maps/documentation/geocoding/intro#StatusCodes
Facebook всегда возвращает 200 для успешных HTTP-запросов, даже если REST-запрос не выполняется: https://developers.facebook.com/docs/graph-api/using-graph-api/error-handling
Все просто, коды состояния HTTP предназначены для запросов HTTP. REST API - это Ваш, определите Ваши коды статуса.