← Теория

🖥 Блок 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

RESTSOAP
ФорматJSON (чаще всего)XML (строгий формат)
ПротоколHTTPHTTP, 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

RESTgRPC
Формат данныхJSON (текст, читаемый)Protobuf (бинарный, компактный)
СкоростьМедленнее (текст → парсинг)Быстрее (бинарный формат)
КонтрактOpenAPI (опционально).proto файл (обязательно)
Тип связиЗапрос-ответЗапрос-ответ, стриминг (server/client/bidirectional)
КодогенерацияНетДа — клиенты и серверы генерируются из .proto
Где используетсяКлиент ↔ сервер (внешние API)Сервер ↔ сервер (микросервисы)

Типы стриминга в gRPC

ТипКлиентСервер
Unary1 запрос1 ответ(как REST)
Server streaming1 запросПоток ответов
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
HttpOnlyCookie недоступен из JavaScriptЗащита от XSS — нельзя украсть cookie скриптом
SecureCookie передаётся только по HTTPSЗащита от перехвата по HTTP
SameSiteLax / Strict / None — когда отправлятьЗащита от CSRF-атак
Expires / Max-AgeСрок жизни cookieПроверять что сессия истекает вовремя
DomainДля какого домена cookieПоддомены — доступен или нет
PathДля каких путей cookieТолько /api или весь сайт

Cookie vs Token (JWT)

CookieToken (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

Типы архитектур

QA важно: при тестировании API ты работаешь на уровне клиент↔сервер. Браузер не нужен — достаточно Postman/curl. Проверяешь что сервер правильно обрабатывает запросы и возвращает корректные ответы.

💬 Вопросы для самопроверки