Какие основные этапы включает жизненный цикл HTTP-запроса?

«Какие основные этапы включает жизненный цикл HTTP-запроса?» — вопрос из категории HTTP и веб-протоколы, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Жизненный цикл HTTP-запроса (Request Lifecycle) — это последовательность этапов от формирования запроса клиентом до получения и обработки ответа.

Основные этапы:

  1. Формирование запроса (Client-Side): Клиентское приложение (браузер, мобильное приложение) определяет:

    • URL и метод HTTP (GET, POST и т.д.).
    • Заголовки (Headers), например, Authorization, Content-Type.
    • Тело запроса (Body), если требуется.
  2. Отправка запроса (Network): Сформированный HTTP-пакет отправляется через сеть (часто через TCP-соединение) на указанный сервер.

  3. Маршрутизация и обработка сервером (Server-Side):

    • Маршрутизация: Веб-сервер (например, Nginx, Apache) или фреймворк (Spring, Express) направляет запрос в нужный обработчик (endpoint handler) на основе URL и метода.
    • Промежуточное ПО (Middleware): Выполняется дополнительная логика: аутентификация, логирование, парсинг тела запроса.
    • Бизнес-логика: Выполняется основной код приложения для обработки запроса (обращение к базе данных, вычисления).
  4. Формирование ответа (Server-Side): Сервер создает HTTP-ответ, включающий:

    • Код состояния (Status Code): 200 OK, 404 Not Found, 500 Internal Server Error.
    • Заголовки ответа (Response Headers).
    • Тело ответа (Response Body): Данные (JSON, HTML) или сообщение об ошибке.
  5. Отправка ответа клиенту (Network): Сервер отправляет сформированный ответ обратно клиенту.

  6. Обработка ответа клиентом (Client-Side): Клиент получает ответ, проверяет статус-код и, если успешно (2xx), парсит тело ответа (например, отображает данные на странице или сохраняет их).

Практический пример на Python с библиотекой requests:

import requests
# Этап 1-2: Формирование и отправка GET-запроса
response = requests.get('https://api.github.com/users/octocat')

# Этап 6: Обработка ответа
if response.status_code == 200: # Проверка успешности
    data = response.json() # Парсинг JSON-тела ответа
    print(f"User login: {data['login']}")
else:
    print(f"Request failed with status: {response.status_code}")