Основы HTTP-протокола: запросы и ответы, методы
Основы HTTP-протокола: запросы, ответы, методы
Введение
HTTP — это язык, на котором общаются клиент и сервер в интернете. Каждый раз, когда ты открываешь страницу или приложение делает запрос к серверу — это HTTP. Для тестировщика знание HTTP — фундамент: без него невозможно читать логи, работать с DevTools или тестировать API.
HTTP-запрос: из чего состоит

Каждый HTTP-запрос содержит:
POST /api/login HTTP/1.1
Host: example.com
Content-Type: application/json
Authorization: Bearer abc123
{
"email": "user@example.com",
"password": "secret"
}
- Метод (
POST) — что мы хотим сделать - URL (
/api/login) — к какому ресурсу обращаемся - Заголовки (Headers) — мета-информация: тип контента, авторизация и т.д.
- Тело (Body) — данные запроса (не у всех методов)
HTTP-ответ: из чего состоит
HTTP/1.1 200 OK
Content-Type: application/json
{
"token": "eyJhbGci...",
"user": { "id": 1, "email": "user@example.com" }
}
- Статус-код (
200 OK) — результат обработки запроса - Заголовки — мета-информация об ответе
- Тело — данные ответа (обычно JSON)
HTTP-методы

| Метод | Назначение | Есть тело? | Идемпотентный? |
|---|---|---|---|
| GET | Получить данные | Нет | Да |
| POST | Создать новый ресурс | Да | Нет |
| PUT | Полностью обновить ресурс | Да | Да |
| PATCH | Частично обновить ресурс | Да | Нет |
| DELETE | Удалить ресурс | Нет/редко | Да |
Идемпотентный — повторный вызов даёт тот же результат. GET один раз и GET десять раз = одинаковый результат. POST создаст 10 записей вместо одной.
Коды статусов: что они означают

2xx — Успех ✓
| Код | Название | Когда используется |
|---|---|---|
| 200 | OK | Стандартный успешный ответ (GET, PUT, PATCH) |
| 201 | Created | Ресурс успешно создан (POST) |
| 204 | No Content | Успех, но тела ответа нет (DELETE) |
3xx — Перенаправление
| Код | Название | Когда используется |
|---|---|---|
| 301 | Moved Permanently | URL ресурса изменился навсегда |
| 302 | Found | Временное перенаправление |
4xx — Ошибка клиента ✗
| Код | Название | Когда используется |
|---|---|---|
| 400 | Bad Request | Некорректный запрос (неверный формат, поля) |
| 401 | Unauthorized | Не авторизован (нет/неверный токен) |
| 403 | Forbidden | Нет прав (токен есть, но доступ запрещён) |
| 404 | Not Found | Ресурс не найден |
| 422 | Unprocessable Entity | Данные формально верны, но логически некорректны |
5xx — Ошибка сервера ✗
| Код | Название | Когда используется |
|---|---|---|
| 500 | Internal Server Error | Необработанная ошибка на сервере |
| 502 | Bad Gateway | Сервер получил неверный ответ от другого сервиса |
| 503 | Service Unavailable | Сервер перегружен или на техобслуживании |
Важное различие: 401 vs 403

- 401 Unauthorized — "Кто ты? Представься." (токен отсутствует или недействителен)
- 403 Forbidden — "Я знаю, кто ты, но тебе сюда нельзя." (прав недостаточно)
Пример: Обычный пользователь пытается зайти в раздел администратора:
- Если не залогинен → 401
- Если залогинен, но не администратор → 403
Типичные ошибки в понимании
- "404 — сервер не работает" — нет, сервер работает, просто ресурс не найден
- "POST и GET — одно и то же, просто разные слова" — принципиально разные: GET читает, POST создаёт
- "5xx — моя вина" — нет, 5xx всегда ошибка на стороне сервера
- "200 = всё хорошо" — не всегда. 200 с телом
{"error": "not found"}— тоже встречается (антипаттерн)
Что мы запомним
- HTTP-запрос = метод + URL + заголовки + (опционально) тело
- HTTP-ответ = статус-код + заголовки + тело
- Методы: GET (читать), POST (создать), PUT/PATCH (обновить), DELETE (удалить)
- 2xx = успех, 4xx = ошибка клиента, 5xx = ошибка сервера
- 401 = не авторизован, 403 = нет прав, 404 = не найден
- Коды статусов — первая вещь, которую смотришь при анализе проблемы