Skip to content

Latest commit

 

History

History
77 lines (56 loc) · 12.5 KB

2.3.1.5 ResponseStatusCode.md

File metadata and controls

77 lines (56 loc) · 12.5 KB

Cтатус-коды

  1. Коды состояния ответа HTTP

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

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

  • Не определены(0-100)

    • 0 Nothing - используется для обозначения отсутствия кода или ошибки при его получении;
  • Информационные ответы (100199)

    • 100 Continue - промежуточный ответ, он указывает, что клиент должен продолжить запрос или игнорировать этот ответ, если запрос уже завершен;
    • 101 Switching Protocols - этот код отправляется в ответ на заголовок запроса Upgrade от клиента и указывает протокол, на который переключается сервер;
    • 102 Processing - сервер получил и обрабатывает запрос, но ответа пока нет;
    • 103 Early Hints - Этот код в первую очередь предназначен для использования с заголовком Link, позволяя пользовательскому агенту начать предварительную загрузку ресурсов или осуществить предварительное соединение к источнику ресурсов, пока сервер готовит ответ;
  • Успешные ответы (200299)

    • 200 ОК - указывает на успешную обработку запроса, когда сервер вернул ожидаемую информацию;
    • 201 Создан - сервер подтвердил создание ресурса;
    • 202 Accepted - удаление будет успешным, но еще не завершено;
    • 204 No Content - удаление было выполнено, но тело ответа отсутствует;
  • Ответы о перенаправлении(редиректы) (300399)

    • 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 должен использоваться и во втором запросе;
  • Ошибки клиента (400499)

    • 400 Плохой запрос - клиент отправил запрос с ошибочными, неполными или недопустимыми данными;
    • 401 Unauthorized - требуется авторизация для доступа к ресурсу;
    • 403 Forbidden - клиент не имеет прав доступа к ресурсу;
    • 404 Not Found - сервер доступен, но запрос направлена на несуществующий или ненайденный ресурс;
    • 405 Метод не поддерживается(неправильный) - метод запроса понятен, но не допустим для конкретного ресурса/используется неправильно (не к тем данным или неправильным способом). При методах GET и HEAD этот код ошибки никогда не должен возвращаться;
    • 409 Конфликт - запрос конфликтует с внутренними операциями сервера (н/р, такой пользователь уже существует в базе данных);
    • 418 I'm a teapot - шутка 1го апреля: сервер отклоняет попытку заварить кофе в чайнике;
    • 429 DDOS - отправлено слишком много запросов в заданный период времени;
  • Ошибки сервера (500599)

    • 500 Внутренняя ошибка сервера - сервер столкнулся с проблемой, которую не смог обработать;
    • 501 Не реализовано - cервер не понимает метод запроса, или не имеет функциональности для его обработки;
    • 502 Bad Gateway - сервер действует как прокси или шлюз и получает недействительный ответ от вышестоящего сервера;
    • 503 Служба недоступна - сервер временно недоступен или перегружен;
    • 504 Gateway Timeout - сервер, действуя как шлюз или прокси, не дождался ответа от вышестоящего сервера и не может завершить обработку запроса;
    • 505 Версия HTTP не поддерживается - сервер не поддерживает версию HTTP, указанную в запросе;

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

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

ℹ️ Коды состояния определены в RFC 9110

Вопрос

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

Еще про редиректы

Короткий и понятный коммент на английскомпро историю создания кодов редиректа и их различия. Краткий перевод: Изначально было 2 кода перенаправления:

  • 301 - это постоянное перенаправление, кэшируется, клиент должен обновить закладки для этого URL, чтобы указывать на новый URL;
  • 302 - это временный редирект, по умолчанию он не кэшируется и новый URL должен запрашиваться каждый раз заново (но вы можете отменить это с помощью заголовков кэширования 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 | Back To iOSWiki Contents | 2.3.2 Web Theme Folder