Программирование с ИИ
ENRU
7.2

HTTP на пальцах

методы, коды, заголовки, тело

Что это

HTTP — язык, на котором клиент и сервер разговаривают. Знать его целиком не нужно, но четыре вещи встречаются постоянно: метод, код ответа, заголовки и тело.

Это же язык, на котором отлаживают: «пришёл 404» или «отдаёт 500» — точное описание проблемы, с которым ИИ сразу понимает, где искать.

Как выглядит в коде

Настоящий обмен — запрос и ответ целиком:

curl -i http://127.0.0.1:8765/subs/7
измерено
HTTP/1.1 200 OK
server: uvicorn
content-length: 40
content-type: application/json

{"user_id":7,"cities":["Oslo","Bergen"]}

Первая строка — код. Дальше заголовки. Пустая строка отделяет их от тела.

Методы

МетодСмыслМеняет данные
GETдайнет
POSTсоздайда
PUTзамени целикомда
PATCHпоправь частьда
DELETEудалида

Главное свойство GET — он не должен ничего менять. Это не формальность: браузеры, поисковики и кеши повторяют GET-запросы сами по себе. Если GET что-то создаёт, оно создастся несколько раз.

Коды ответов

Первая цифра говорит, кто виноват:

ДиапазонЧто значит
2xxвсё хорошо
3xxищи в другом месте
4xxклиент ошибся
5xxсервер сломался

Шесть кодов, которые встретятся чаще всего:

КодКогдаИз нашего примера
200всё хорошоGET /subs/7
201созданоPOST /subs/7 с новым городом
400запрос кривой
401 / 403не вошёл / не положено
404нет такогоGET /subs/999
409конфликтповторная подписка на тот же город
422формат верный, данные не проходят проверкугород короче двух символов
500ошибка на сервере

Все эти коды в нашем примере настоящие:

curl -X POST .../subs/7 -d '{"city":"Tromsø"}'   → 201
curl -X POST .../subs/7 -d '{"city":"Tromsø"}'   → 409  (уже подписан)
curl -X POST .../subs/7 -d '{"city":"X"}'        → 422  (короче двух символов)

Заголовки

Служебные поля запроса и ответа. Знать надо три:

ЗаголовокЗачем
Content-Typeв каком формате тело: application/json
Authorizationкто спрашивает: токен или ключ
User-Agentкто клиент

Authorization — тот самый заголовок, в котором едут секреты. Про него отдельно в статье 7.8.

Тело

Данные запроса или ответа. Почти всегда JSON. У GET тела обычно нет — параметры передают в адресе:

измерено
/subs?city=Oslo&limit=10

Это строка запроса: пары «ключ = значение» после знака вопроса.

Как сказать ИИ

Запрос
Сервер отдаёт 500 на POST /subs/7 с телом {"city": ""}.
Должен отдавать 422. Вот обработчик: <код>.
Почему валидация не срабатывает?
Запрос
Какой код ответа правильный, если пользователь пытается
подписаться на город, на который уже подписан? Объясни выбор.
Запрос
Напиши curl-команды для проверки всех четырёх случаев:
успех, нет пользователя, повторная подписка, кривые данные.
С выводом кода ответа.

Последний запрос даёт готовый набор проверок — ровно то, что нужно для неудачных случаев из статьи 4.1.

На что смотреть

200 на ошибку. Ответ {"error": "не найден"} с кодом 200 ломает всех клиентов: они смотрят на код, а не читают текст.

500 на кривые данные. Значит, проверки нет и сервер падает на необработанном исключении. Правильный ответ — 400 или 422.

GET, который что-то меняет. Повторится сам, без участия пользователя.

Текст ошибки с лишним. Трейсбек в теле ответа показывает структуру проекта всем желающим. Подробности — в лог, клиенту короткое сообщение.

Код выбран наугад. 400 вместо 404, 403 вместо 401 — клиент не сможет отличить «не вошёл» от «вошёл, но не положено».

Шпаргалка

  • Четыре части: метод · код · заголовки · тело.

  • GET не меняет данные — иначе повторится сам.

  • 4xx — виноват клиент, 5xx — виноват ты.

  • 404 нет такого, 409 конфликт, 422 не прошло проверку.

  • 500 на кривые данные означает забытую валидацию.

  • Трейсбек в ответе клиенту — утечка структуры проекта.