Угадайте HTTP-статус по жизненной ситуации

—

от автора

Что общего у сервера и интеллигентного человека? Есть много способов послать собеседника… да хотя бы выждать паузу. В случае сервера каждый способ закодирован трёхзначным числом. Разработчики и тестировщики видят эти числа каждый день, но 502 и 504 путают даже опытные люди.

А что, если представить HTTP-статусы в виде бытовых ситуаций? Ниже будет список из 12 вопросов, в каждом вопросе — описание ситуации и четыре кода на выбор. Ответ с объяснением спрятан под спойлером. Считайте правильные ответы и в конце узнаете ваш статус.

1. Звонок маме

— Мам, как у вас дела?

— Да всё как обычно.

А. 200 OK

Б. 204 No Content

В. 302 Found

Г. 304 Not Modified

Ответ

Г. 304 Not Modified.

Браузер спрашивает: «У меня есть копия от такого-то числа/по такому-то тегу, она ещё годится?» Сервер отвечает 304 и не пересылает ответ заново, экономя трафик и время.

Мама не пересказывает подробно, как устроена её жизнь, вы это и так знаете. Она просто подтверждает, что ничего не поменялось.

2. Родительский чат

Классная руководительница пишет: «Завтра нужно принести 2000 рублей на шторы». Через пять минут у сообщения 30 прочитавших и ни одного ответа.

А. 200 OK

Б. 202 Accepted

В. 204 No Content

Г. 205 Reset Content

Ответ

В. 204 No Content

Запрос выполнен, но рассказывать нечего, так что тела у ответа нет. Распространенный вариант — удаление чего-то через API.

В примере с чатом тридцать успешных 204 подряд. Учительница не знает, сдадут ли деньги, но формально все запросы обработаны.

Хотя в реальности там будут и другие коды

«Хорошо, сдадим» → 200 OK. Запрос выполнен успешно, и в ответе есть содержимое.

«Перевела, вот чек» со скриншотом → 201 Created: ресурс создан, вот ссылка на него.

«Сдам в понедельник» → 202 Accepted: принято, обработка позже.

«А можно переводом? Наличных нет» → 415 Unsupported Media Type. Запрос понятен, но с указанным типом данных работать не получится.

«Мы же меняли шторы в прошлом году» → 409 Conflict: запрос противоречит текущему состоянию ресурса.

«А почему 2000? Кто это решил? Где смета?» → 403 Forbidden: сначала подтвердите полномочия.

«Простите, это какой класс? Я, кажется, не в тот чат попала» → 404 Not Found.

Голосовое на 4 минуты о том, как всё подорожало → 413 Payload Too Large.

И обязательно: «Мой сын болеет, его не будет» → 422 Unprocessable Content: запрос корректный, но есть какая-то логическая ошибка, из-за которой нельзя провести операцию.

3. Закрытая вечеринка

Вы показали охраннику пропуск. Он внимательно его изучил, сверил фото и всё равно не пустил: «Сегодня только для руководства».

А. 400 Bad Request

Б. 401 Unauthorized

В. 403 Forbidden

Г. 404 Not Found

Ответ

В. 403 Forbidden.

Его часто путают с 401, но тот означает: «я не знаю, кто вы, представьтесь». 403: «я знаю, кто вы, но вам сюда нельзя». Пропуск охранник признал, значит, это 403.

4. Табличка на двери

Вы пошли в любимый книжный, а на его двери табличка: «Мы переехали навсегда, новый адрес такой-то».

А. 301 Moved Permanently

Б. 302 Found

В. 307 Temporary Redirect

Г. 410 Gone

Ответ

А. 301 Moved Permanently.

Браузер запоминает новый адрес и в следующий раз сразу идёт туда, а поисковики меняют адрес страницы в индексе. Поэтому ошибочный 301 долго откатывать — браузеры держат его в кеше. Для временных переездов есть 302 и 307.

5. Нас больше нет

Тот же книжный через год. На двери новая табличка: «Магазин закрыт навсегда».

А. 404 Not Found

Б. 410 Gone

В. 451 Unavailable For Legal Reasons

Г. 503 Service Unavailable

Ответ

Б. 410 Gone.

При 404 сервер не нашёл ресурса по этому адресу и не знает, был ли он вообще. 410 означает, что ресурс был, но теперь недоступен навсегда. Поисковики убирают такие страницы из выдачи быстрее, поэтому 410 полезен при чистке старого контента.

6. «Ну что, готово?»

Нужно выкатить срочную фичу в релиз. Продакт уже пять раз спросил про статус, попросил «маленькую правку» и поставил созвон «синхронизироваться по статусу». Разработчик выключил уведомления и ушёл на обед на час, поставив статус в мессенджере.

А. 408 Request Timeout

Б. 425 Too Early

В. 429 Too Many Requests

Г. 503 Service Unavailable

Ответ

В. 429 Too Many Requests.

Так сервер сообщает, что вы превысили лимит запросов. Часто к ответу прилагается заголовок Retry-After, показывающий, когда можно повторить запрос. Хороший клиент его читает и потом ждёт, плохой продолжает дергать сервер.

7. Перезвоните позже

Вам неожиданно заблокировали карту и вы звоните в поддержку банка. Автоответчик: «Ведутся технические работы, перезвоните позже».

А. 500 Internal Server Error

Б. 502 Bad Gateway

В. 503 Service Unavailable

Г. 504 Gateway Timeout

Ответ

В. 503 Service Unavailable.

Сервер жив и понимает вас, но прямо сейчас не может помочь из-за перегрузки или планового обслуживания.

500 означало бы, что у оператора внутри что-то сломалось и он сам не понимает что.

8. Уехать любой ценой

Вы ездили к другу в гости в пригород и теперь пытаетесь уехать на такси ночью. Десять минут вы наблюдаете надпись «Ищем водителя…», которая затем сменяется на «Не удалось найти водителя». Приложение отработало, а водителей рядом не оказалось.

А. 408 Request Timeout

Б. 502 Bad Gateway

В. 503 Service Unavailable

Г. 504 Gateway Timeout

Ответ

Г. 504 Gateway Timeout.

Приложение — это шлюз: прокси, балансировщик или nginx. Он ждал, но сервер за ним не ответил вовремя.

А 408 — обратная ситуация: сервер устал ждать, пока клиент закончит свой запрос.

9. Не тот прибор

Вы командуете голосовому помощнику: «Свари кофе». Команда уходит на умный чайник, и тот с достоинством отвечает: «Я чайник. Кофе не варю».

А. 400 Bad Request

Б. 405 Method Not Allowed

В. 418 I’m a teapot

Г. 422 Unprocessable Content

Ответ

В. 418 I’m a teapot.

Этот код появился в первоапрельском RFC 2324 от 1998 года про протокол управления кофеварками. В 2017 году его попытались убрать из Node.js и Go, но сообщество устроило кампанию «Save 418». В итоге код зарезервировали, чтобы никто его не занял.

10. Идеальное место

Вы хотите сходить в кино, открываете схему зала и видите идеальное место по центру. Скорее нажимаете «забронировать» и … «Место уже занято».

А. 400 Bad Request

Б. 409 Conflict

В. 412 Precondition Failed

Г. 429 Too Many Requests

Ответ

Б. 409 Conflict.

Запрос сам по себе нормальный, но противоречит текущему состоянию данных. Очень похож с 412, но там клиент заранее ставит условия для проверки версии ресурса.

11. Сегодня без кофе

Вы засовываете в кофейный автомат мятую сторублёвку. Автомат её втягивает, думает и выплёвывает обратно. Вы разглаживаете купюру о край стола и пробуете снова. Автомат снова выплёвывает.

А. 400 Bad Request

Б. 406 Not Acceptable

В. 424 Failed Dependency

Г. 501 Not Implemented

Ответ

А. 400 Bad Request.

Деньги настоящие, кофе в автомате есть, но «запрос» пришёл в неправильном формате.

12. Перевес

Вы хорошенько закупились в отпуске, сдаёте чемодан в багаж, а весы на стойке показывают 30 кг при лимите 23. Сотрудник даже не спрашивает, что внутри, просто не пропускает.

А. 400 Bad Request

Б. 411 Length Required

В. 413 Content Too Large

Г. 507 Insufficient Storage

Ответ

В. 413 Content Too Large.

Тело запроса больше, чем сервер готов принять (но мы-то знаем, что место там есть, поэтому не 507). Классический случай: пользователь загружает фото на 5 МБ и получает ошибку, потому что nginx по умолчанию пропускает тела запросов только до 1 МБ.

Результаты

Пора посчитать правильные ответы.

Баллы

Статус

0–4

«Ошибка? Обновлю страницу». Главный инструмент отладки — F5, пока ни разу не подвёл.

5–8

«Читаю логи со словарём». Основы на месте, осталось перестать путать 401 и 403.

9–11

«Мне можно спорить с бэкендерами». И, что важнее, выигрывать.

12

«Сам пишу RFC». Расскажите в комментариях, какой код вам кажется недооценённым.

Бонусные вопросы

Они не входят в основной счёт, это для тех, кому хочется ещё.

Бонус 1. Литературный код

Какой статус назван в честь антиутопии Рэя Брэдбери?

А. 403 Forbidden

Б. 404 Not Found

В. 418 I’m a teapot

Г. 451 Unavailable For Legal Reasons

Ответ

Г. 451 Unavailable For Legal Reasons — ресурс недоступен по юридическим причинам. Это отсылка к «451 градусу по Фаренгейту». Его закрепили в RFC 7725 в 2016 году.

Бонус 2. Вечное «потом»

Какой код ещё в 1990-х зарезервировали «для будущего использования», и это будущее официально так и не наступило?

А. 402 Payment Required

Б. 406 Not Acceptable

В. 418 I’m a teapot

Г. 505 HTTP Version Not Supported

Ответ

А. 402 Payment Required.

Он был придуман для систем цифровых платежей или микроплатежей в интернете. Платежи появились, но жили своей жизнью, а 402 так и остался в стандарте с пометкой «зарезервировано». Некоторые сервисы сейчас всё равно используют его, когда у пользователя закончилась подписка.

Что проверить в своём проекте

Квиз шуточный, а баги настоящие. До релиза продукта стоит сделать несколько проверок:

  1. 304. Есть ли версионирование у больших ответов/файлов?

  2. 429. Читает ли клиент Retry-After или продолжает повторять запросы в цикле?

  3. 503 и 504. Есть ли понятный экран ошибки, или приложение бесконечно крутит лоадер?

  4. 413. Что видит пользователь, загружая файл больше лимита: внятное сообщение или «что-то пошло не так»? (личное от автора — некоторые сайты показывают общую непонятную ошибку и не показывают лимит, что дико раздражает)

  5. 401. Отправляет ли приложение пользователя на повторный вход, когда сессия истекла?

Для сайта хватит вкладки Network в браузере. Для мобильных приложений используют отладочные прокси: Charles, Fiddler, Proxyman, mitmproxy или Solpuga.

Про тг-канал

Ха-ха, попались! А тут его нет.

ссылка на оригинал статьи https://habr.com/ru/articles/1097542/