← Теория
🖥 Блок 02 — Backend-тестирование Ozon
HTTP · gRPC · Клиент-сервер · Методы · Коды ответов · Cookie
🌐 1. HTTP — как работает веб
HTTP (HyperText Transfer Protocol) — протокол, по которому клиент (браузер) и сервер общаются. Это текстовый протокол запрос-ответ.
🖥 Клиент (браузер, приложение, Postman)
↓ HTTP-запрос (Request)
🖥 Сервер (backend)
↑ HTTP-ответ (Response)
🖥 Клиент получает данные
Структура HTTP-запроса
1. Стартовая строка: GET /api/users HTTP/1.1
2. Заголовки (Headers):
Host: example.com
Content-Type: application/json
Authorization: Bearer abc123
3. Пустая строка (разделитель)
4. Тело (Body): {"name": "Natasha"}
(у GET тела обычно нет)
Структура HTTP-ответа
1. Стартовая строка: HTTP/1.1 200 OK
2. Заголовки:
Content-Type: application/json
Set-Cookie: session=xyz
3. Пустая строка
4. Тело: {"id": 1, "name": "Natasha"}
Запомни: Запрос = стартовая строка + заголовки + тело. Ответ — так же. Разница только в стартовой строке: запрос содержит метод + путь, ответ — код + текст.
📤 2. HTTP-методы
| Метод | Действие | Тело запроса | Идемпотентный? | Пример |
| GET | Получить данные | Нет | ✅ Да | GET /users/1 |
| POST | Создать ресурс | Да | ❌ Нет | POST /users + body |
| PUT | Заменить ресурс целиком | Да | ✅ Да | PUT /users/1 + body |
| PATCH | Частично обновить | Да | ❌ Нет* | PATCH /users/1 + {"name":"X"} |
| DELETE | Удалить ресурс | Может быть | ✅ Да | DELETE /users/1 |
| HEAD | Как GET, но без тела | Нет | ✅ Да | Проверить существует ли |
| OPTIONS | Узнать допустимые методы | Нет | ✅ Да | CORS preflight |
Что значит «идемпотентный»?
Идемпотентный = повторный вызов даёт тот же результат. Отправил PUT 10 раз — ресурс тот же. Отправил POST 10 раз — создастся 10 записей (если нет защиты).
На собе часто спрашивают: разница PUT vs PATCH?
- PUT — заменяет ресурс целиком. Обязательно передавать ВСЕ поля.
- PATCH — обновляет только переданные поля. Остальные не трогает.
PUT {"name":"X"} → остальные поля станут null/default.
PATCH {"name":"X"} → только name изменится, email и другие останутся.
🔢 3. Коды ответов HTTP
| Диапазон | Категория | Что значит | Частые примеры |
| 1xx |
Информационные |
Запрос получен, процесс продолжается |
100 Continue |
| 2xx |
Успех ✅ |
Запрос успешно обработан |
200 OK, 201 Created, 204 No Content |
| 3xx |
Перенаправление |
Нужны дополнительные действия |
301 Moved Permanently, 302 Found, 304 Not Modified |
| 4xx |
Ошибка клиента ❌ |
Клиент послал что-то не то |
400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 429 Too Many Requests |
| 5xx |
Ошибка сервера 💥 |
Сервер не смог обработать |
500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable |
Часто путают: 401 vs 403
| Код | Смысл | Пример |
| 401 Unauthorized | Ты не представился (нет токена / неверный логин) | Не передал Authorization header |
| 403 Forbidden | Ты представился, но нет прав | Обычный юзер пытается в админку |
Мнемоника: 401 = «Кто ты?», 403 = «Я знаю кто ты, но тебе нельзя».
200 vs 201 vs 204
| Код | Когда | Тело ответа |
| 200 OK | Успешный GET, PUT, PATCH | Да — возвращаем данные |
| 201 Created | Успешный POST — ресурс создан | Да — возвращаем созданный ресурс |
| 204 No Content | Успешный DELETE (иногда PUT) | Нет — ничего не возвращаем |
🔗 4. REST API
REST (Representational State Transfer) — это набор правил, как проектировать API поверх HTTP. Не протокол, а стиль архитектуры.
Принципы REST
| Принцип | Суть | Пример |
| Ресурсы — существительные | URL описывает ресурс, а не действие | /users ✅ /getUsers ❌ |
| Методы — глаголы | Действие задаётся HTTP-методом | GET /users = получить, DELETE /users/1 = удалить |
| Stateless | Каждый запрос содержит всю нужную инфу. Сервер не хранит состояние сессии | Каждый запрос несёт токен авторизации |
| Единообразный интерфейс | Одни и те же правила для всех ресурсов | GET /users, GET /orders — одинаково |
REST vs SOAP
| REST | SOAP |
| Формат | JSON (чаще всего) | XML (строгий формат) |
| Протокол | HTTP | HTTP, SMTP, TCP и др. |
| Сложность | Простой, гибкий | Сложный, строгий |
| Где используется | Современные API, мобилки, SPA | Банки, платёжные системы, enterprise |
| Контракт | OpenAPI / Swagger (опционально) | WSDL (обязательно) |
На собе: REST — это не протокол, а архитектурный стиль. Он использует HTTP-методы как глаголы, а URL как существительные (ресурсы). Stateless = сервер не помнит предыдущие запросы.
📡 5. gRPC
gRPC (gRPC Remote Procedure Call) — современный фреймворк от Google для общения между сервисами. Альтернатива REST для межсерверного взаимодействия (backend ↔ backend).
gRPC vs REST
| REST | gRPC |
| Формат данных | JSON (текст, читаемый) | Protobuf (бинарный, компактный) |
| Скорость | Медленнее (текст → парсинг) | Быстрее (бинарный формат) |
| Контракт | OpenAPI (опционально) | .proto файл (обязательно) |
| Тип связи | Запрос-ответ | Запрос-ответ, стриминг (server/client/bidirectional) |
| Кодогенерация | Нет | Да — клиенты и серверы генерируются из .proto |
| Где используется | Клиент ↔ сервер (внешние API) | Сервер ↔ сервер (микросервисы) |
Типы стриминга в gRPC
| Тип | Клиент | Сервер |
| Unary | 1 запрос | 1 ответ | (как REST) |
| Server streaming | 1 запрос | Поток ответов |
| Client streaming | Поток запросов | 1 ответ |
| Bidirectional | Поток запросов | Поток ответов |
На собе: gRPC быстрее REST за счёт бинарного формата (Protobuf). Используется между микросервисами. REST — для внешних API (клиент↔сервер). gRPC поддерживает стриминг, REST — только запрос-ответ.
🍪 6. Cookie
Cookie — маленький кусок данных, который сервер отправляет клиенту, а клиент хранит и отправляет обратно при каждом запросе к этому домену.
Как работают Cookie
1. Клиент → Сервер: «Привет, залогини меня»
2. Сервер → Клиент: Set-Cookie: session=abc123
3. Клиент → Сервер (следующий запрос): Cookie: session=abc123
4. Сервер: «О, я помню тебя!»
Атрибуты Cookie
| Атрибут | Что делает | Зачем нужен QA |
| HttpOnly | Cookie недоступен из JavaScript | Защита от XSS — нельзя украсть cookie скриптом |
| Secure | Cookie передаётся только по HTTPS | Защита от перехвата по HTTP |
| SameSite | Lax / Strict / None — когда отправлять | Защита от CSRF-атак |
| Expires / Max-Age | Срок жизни cookie | Проверять что сессия истекает вовремя |
| Domain | Для какого домена cookie | Поддомены — доступен или нет |
| Path | Для каких путей cookie | Только /api или весь сайт |
Cookie vs Token (JWT)
| Cookie | Token (JWT) |
| Где хранится | Браузер (автоматически) | localStorage / sessionStorage |
| Кто отправляет | Браузер автоматически в заголовке | Клиент вручную в Authorization header |
| CSRF-уязвимость | Да (браузер отправляет автоматически) | Нет (надо явно передать) |
| XSS-уязвимость | HttpOnly защищает | Токен доступен из JS — может украсть |
| Мобильные приложения | Неудобно | Удобно — храним в памяти |
На собе: Cookie = сервер ставит, браузер автоматически отправляет. Token = клиент сам хранит и отправляет. Cookie уязвим к CSRF (потому что автоматический), Token — к XSS (потому что доступен из JS).
🏗 7. Клиент-серверная архитектура
Как это работает
📱 Клиент (браузер / мобилка / Postman)
↕ HTTP / HTTPS
🖥 Сервер (Backend: API, логика)
↕ SQL / запрос
🗄 База данных (PostgreSQL, Redis и т.д.)
Роли
| Кто | Что делает | Примеры |
| Клиент | Показывает UI, отправляет запросы, отображает данные | Chrome, мобильное приложение, Postman |
| Сервер | Обрабатывает запросы, бизнес-логика, возвращает данные | Node.js, Go, Python, Java |
| База данных | Хранит данные | PostgreSQL, MongoDB, Redis |
Типы архитектур
- Монолит: всё в одном приложении. Просто, но тяжело масштабировать.
- Микросервисы: каждый сервис отвечает за свою часть (users, orders, payments). Независимо деплоятся, но сложнее в отладке.
- SOA: предшественник микросервисов, сервисы общаются через шину (ESB).
QA важно: при тестировании API ты работаешь на уровне клиент↔сервер. Браузер не нужен — достаточно Postman/curl. Проверяешь что сервер правильно обрабатывает запросы и возвращает корректные ответы.
💬 Вопросы для самопроверки