Что такое протокол HTTP и как он работает
Что проверяют
Понимаете ли вы, что происходит между вызовом requests.get() и ответом сервера, а не только помните слово «протокол». Следом почти всегда спрашивают про отличия HTTP/1.1, HTTP/2 и HTTP/3 или про идемпотентность методов.
Как отвечать
HTTP это прикладной протокол «запрос и ответ» без состояния: сервер не помнит предыдущий запрос, всё нужное приходит в самом запросе (куки, токен в Authorization). Каркас ответа:
- запрос: метод, путь, версия, заголовки и необязательное тело. В HTTP/1.1 заголовок
Hostобязателен, по нему один сервер обслуживает много сайтов; - ответ: статус, заголовки, тело. Классы кодов: 2xx успех, 3xx перенаправление, 4xx ошибка клиента, 5xx ошибка сервера. Полезно различать 401 (не аутентифицирован) и 403 (нет прав);
- методы:
GET,HEAD,PUT,DELETEидемпотентны,POSTнет. Поэтому повторять при таймауте безопасноPUT, а неPOST; - соединение: для HTTP/1.1 и HTTP/2 запросу предшествуют DNS, TCP и для HTTPS рукопожатие TLS (сейчас это TLS 1.2 или 1.3, SSL давно выведен из употребления). В HTTP/1.1 соединение по умолчанию постоянное, закрывает его
Connection: close; - версии: HTTP/2 передаёт бинарные фреймы, мультиплексирует много запросов в одном TCP-соединении и сжимает заголовки HPACK. HTTP/3 работает поверх QUIC на UDP, и потерянный пакет больше не тормозит все запросы разом.
Привяжите к Python: requests говорит по HTTP/1.1, httpx умеет HTTP/2 через http2=True. На сервере запрос доходит до кода через WSGI (Django, Flask) или ASGI (FastAPI, Starlette), а TLS и HTTP/2 чаще завершает nginx перед приложением.
Где спотыкаются
Говорят, что keep-alive в HTTP/1.1 включается заголовком Connection: keep-alive. Это поведение HTTP/1.0, в 1.1 постоянное соединение идёт по умолчанию.
Путают «без состояния» с «сессий не бывает». Протокол состояния не хранит, сессия живёт в куке или токене и на стороне приложения.
Отвечают на всё кодом 200 с полем error в теле или отдают 500 на ошибку валидации. Клиенты, прокси и мониторинг ориентируются на код ответа, поэтому ошибка ввода это 400 или 422.