# Cтатус-коды

1. [Коды состояния ответа HTTP](https://developer.mozilla.org/ru/docs/Web/HTTP/Status)

**Статус-код** приходит от сервера в ответ на запрос и представляет собой трехзначное число в диапазоне от 100 до 599. Это число несет информационный характер о результате обработки запроса сервером.

В протоколе HTTP статус-коды подразделяются на пять категорий:

* Не определены(`0`-`100`) 
    * `0 Nothing` - используется для обозначения отсутствия кода или ошибки при его получении;

* [Информационные ответы](https://developer.mozilla.org/ru/docs/Web/HTTP/Status#информационные_ответы) (`100` – `199`)
    * `100 Continue` - промежуточный ответ, он указывает, что клиент должен продолжить запрос или игнорировать этот ответ, если запрос уже завершен;
    * ` 101 Switching Protocols` - этот код отправляется в ответ на заголовок запроса Upgrade от клиента и указывает протокол, на который переключается сервер;
    * ` 102 Processing` - сервер получил и обрабатывает запрос, но ответа пока нет;
    * `103 Early Hints` - Этот код в первую очередь предназначен для использования с заголовком [Link](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Link), позволяя пользовательскому агенту начать [предварительную загрузку](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel/preload) ресурсов или осуществить [предварительное соединение](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel/preconnect) к источнику ресурсов, пока сервер готовит ответ;

* [Успешные ответы](https://developer.mozilla.org/ru/docs/Web/HTTP/Status#успешные_ответы) (`200` – `299`)
    * `200 ОК` - указывает на успешную обработку запроса, когда сервер вернул ожидаемую информацию;
    * `201 Создан` - сервер подтвердил создание ресурса;
    * `202 Accepted` - удаление будет успешным, но еще не завершено;
    * `204 No Content` - удаление было выполнено, но тело ответа отсутствует;

* [Ответы о перенаправлении](https://developer.mozilla.org/ru/docs/Web/HTTP/Status#сообщения_о_перенаправлении)(редиректы) (`300` – `399`)
    * `300 Множественный выбор` - запрос клиента имеет несколько возможных ответов;
    * `301 Перемещено навсегда` - искомый ресурс был навсегда перемещен по другому URL. Пользователи и боты будут перенаправлены на этот новый URL;
    * `302 Found` - URI запрошенного ресурса был _временно_ изменен. В будущем могут быть внесены дальнейшие изменения в URI. Следовательно, этот же URI должен использоваться клиентом в будущих запросах;
    * `303 See Other` - клиенту необходимо получить запрошенный ресурс по другому URI с помощью запроса `GET`;
    * `307 Temporary Redirect` - клиенту необходимо получить запрошенный ресурс по другому URI тем же методом, который использовался в предыдущем запросе. Он имеет ту же семантику, что и код ответа `302 Found`, за исключением того, что пользовательский агент _не должен_ изменять используемый метод: если в первом запросе использовался `POST`, то `POST` должен использоваться и во втором запросе;
    * `308 Permanent Redirect` - ресурс теперь находится по другому URI, указанному в заголовке ответа `Location`. Он имеет ту же семантику, что и код ответа `301 Moved Permanently`, за исключением того, что пользовательский агент не должен изменять используемый метод: если в первом запросе использовался `POST`, то `POST` должен использоваться и во втором запросе;


* [Ошибки клиента](https://developer.mozilla.org/ru/docs/Web/HTTP/Status#ошибки_клиента) (`400` – `499`)
    * `400 Плохой запрос`  - клиент отправил запрос с ошибочными, неполными или недопустимыми данными;
    * `401 Unauthorized` - требуется авторизация для доступа к ресурсу;
    * `403 Forbidden` - клиент не имеет прав доступа к ресурсу;
    * `404 Not Found` - сервер доступен, но запрос направлена на несуществующий или ненайденный ресурс;
    * `405 Метод не поддерживается(неправильный)` - метод запроса понятен, но не допустим для конкретного ресурса/используется неправильно (не к тем данным или неправильным способом). При методах GET и HEAD этот код ошибки никогда не должен возвращаться;
    * `409 Конфликт` - запрос конфликтует с внутренними операциями сервера (н/р, такой пользователь уже существует в базе данных);
    * `418 I'm a teapot` - шутка 1го апреля: сервер отклоняет попытку заварить кофе в чайнике;
    * `429 DDOS` - отправлено слишком много запросов в заданный период времени;


* [Ошибки сервера](https://developer.mozilla.org/ru/docs/Web/HTTP/Status#ошибки_сервера) (`500` – `599)`
    * `500 Внутренняя ошибка сервера` - сервер столкнулся с проблемой, которую не смог обработать;
    * `501 Не реализовано` - cервер не понимает метод запроса, или не имеет функциональности для его обработки;
    * `502 Bad Gateway` - сервер действует как прокси или шлюз и получает недействительный ответ от вышестоящего сервера;
    * `503 Служба недоступна` - сервер временно недоступен или перегружен;
    * `504 Gateway Timeout` - сервер, действуя как шлюз или прокси, не дождался ответа от вышестоящего сервера и не может завершить обработку запроса;
    * `505 Версия HTTP не поддерживается` - сервер не поддерживает версию HTTP, указанную в запросе;

Хотя разработчики и определяют статус-коды для своих приложений, хорошей практикой считается следование стандартам разработки API. Например:

Если при регистрации пользователя сервер возвращает ответ `200 OK` вместо `201 Created`, это не обязательно ошибка. Но, как правило, следование стандартам считается наилучшей практикой. При тестировании API тестировщикам стоит опираться на документацию и здравый смысл. Если документация указывает на ожидаемый ответ `200 OK`, значит, таково решение разработчика. Но в таких ситуациях стоит уточнять документацию.

> ℹ️  Коды состояния определены в [RFC 9110](https://httpwg.org/specs/rfc9110.html#overview.of.status.codes)

## Вопрос

На собеседовании могут спросить, чем `502`-й статус-код отличается от `504`-го? В случае `502`-го статус-кода при запросе к серверу наш сервер обратился к вышестоящему серверу для получения информации и получил от него некорректный ответ. А в случае с `504`-м наш сервер не дождался ответа от вышестоящего сервера в принципе.

## Еще про редиректы
[Короткий и понятный коммент на английском](https://serverfault.com/a/391369)про историю создания кодов редиректа и их различия. Краткий перевод:
**Изначально было 2 кода перенаправления:**
* 301 - это постоянное перенаправление, кэшируется, клиент должен обновить закладки для этого URL, чтобы указывать на новый URL;
* 302 - это временный редирект, по умолчанию он не кэшируется и новый URL должен запрашиваться каждый раз заново (но вы можете отменить это с помощью [заголовков кэширования Cache-Control](https://developer.mozilla.org/ru/docs/Web/HTTP/Headers/Cache-Control));

Для обоих вышеупомянутых случаев повторный запрос должен использовать тот же метод (POST, GET, CONNECT, PUT, DELETE и т. д.), что и исходный запрос, а для любых других запросов, кроме GET и HEAD, клиент должен спросить пользователя перед выполнением запроса.  К сожалению, именно в этой части клиенты иногда ошибаются, и большинство из них меняют метод для последующего запроса на GET, независимо от первоначального метода. В связи с этим были созданы еще три кода редиректа.

**Новые редиректы:**
* 303 - то же самое, что и 302 (т. е. временный), за исключением того, что последующий запрос теперь явно меняется на GET-запрос, и подтверждение не требуется;
* 307 - то же самое, что и 302 (т. е. временный), за исключением того, что последующий запрос теперь явно такой же, как и исходный, и для методов запроса, отличных от GET и HEAD, необходимо получить подтверждение от пользователя;
* 308 - то же самое, что и 301 (т. е. постоянный), за исключением того, что метод запроса и тело не будут изменены;

---

[2.3.1.4 HTTP Methods Theme](./2.3.1.4%20HTTP_Methods.md) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [2.3.2 Web Theme Folder](../2.3.2%20Web/)
