Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
POST: HTTP метод создания данных
Что такое POST?
POST — это HTTP метод, который используется для отправки данных на сервер с целью создания нового ресурса. POST request передаёт данные в теле запроса (body), а не в URL, как это делает GET.
Основные характеристики POST
Отправка данных
- Данные находятся в теле (body) запроса
- Данные не видны в URL (более безопасно для чувствительной информации)
- Может отправлять большие объёмы данных
- Данные кодируются как JSON, XML, form-data и т.д.
Создание нового ресурса
- POST используется для создания новых объектов
- Сервер определяет ID нового ресурса
- Обычно возвращает 201 Created статус код
- Возвращает данные созданного ресурса
Не идемпотентен
- Два одинаковых POST запроса создадут два разных ресурса
- Поэтому повтор запроса может привести к дублированию
Изменяет состояние сервера
- POST имеет побочные эффекты
- Создаёт новые данные в БД
Практические примеры POST
Пример 1: Создание пользователя
POST /api/v1/users
Content-Type: application/json
{
"name": "John Doe",
"email": "john@example.com",
"password": "securepass123"
}
Ответ (201 Created):
{
"id": 42,
"name": "John Doe",
"email": "john@example.com",
"created_at": "2024-03-26T10:30:00Z"
}
Пример 2: Создание заказа
POST /api/v1/orders
Content-Type: application/json
{
"user_id": 42,
"items": [
{"product_id": 1, "quantity": 2},
{"product_id": 5, "quantity": 1}
],
"total_amount": 99.99
}
Ответ (201 Created):
{
"order_id": 1000,
"status": "pending",
"created_at": "2024-03-26T10:35:00Z"
}
Пример 3: Отправка комментария
POST /api/v1/posts/100/comments
Content-Type: application/json
{
"content": "Отличная статья!",
"user_id": 42
}
Ответ (201 Created):
{
"comment_id": 500,
"post_id": 100,
"content": "Отличная статья!",
"created_at": "2024-03-26T10:40:00Z"
}
POST vs GET
| Аспект | GET | POST |
|---|---|---|
| Назначение | Получение данных | Создание данных |
| Данные | В URL (видны) | В теле (не видны) |
| Объём данных | Ограничен размером URL | Не ограничен |
| Безопасность | Низкая (видны в истории) | Выше (не видны в URL) |
| Кэширование | Кэшируется | Обычно не кэшируется |
| Идемпотентность | Идемпотентен | Не идемпотентен |
| Побочные эффекты | Нет | Да (создаёт данные) |
| Статус код | 200 OK | 201 Created |
POST vs PUT
POST — создание нового ресурса
POST /api/v1/users
→ Создаёт нового пользователя с ID, который определяет сервер
→ Возвращает 201 Created
PUT — замена или обновление ресурса
PUT /api/v1/users/42
→ Заменяет пользователя с ID 42 (или создаёт если не существует)
→ ID определяется клиентом в URL
→ Возвращает 200 OK или 201 Created
PATCH — частичное обновление
PATCH /api/v1/users/42
→ Обновляет только переданные поля пользователя
→ Остальные поля не меняются
→ Возвращает 200 OK
Статус коды при POST
201 Created (Успешное создание)
- Ресурс успешно создан
- Обычно возвращает созданный объект
- Может содержать Location header с URL нового ресурса
200 OK (Успех, но нет созданного объекта)
- Иногда используется вместо 201
- Менее правильно, но встречается
400 Bad Request (Ошибка в данных)
- Переданные данные неверные
- Пример: забыли email, или email неверного формата
- Сервер не создаёт ресурс
401 Unauthorized (Не авторизован)
- Пользователь не залогинен
- Нужна аутентификация
403 Forbidden (Запрещено)
- Пользователь авторизован но не имеет прав
- Пример: обычный пользователь пытается создать admin
409 Conflict (Конфликт)
- Ресурс уже существует
- Пример: почта уже зарегистрирована
422 Unprocessable Entity (Невозможно обработать)
- Данные валидны по формату но неприемлемы по логике
- Пример: дата рождения в будущем
500 Internal Server Error (Ошибка сервера)
- Ошибка на стороне сервера
- Ресурс может быть или не быть создан
Content-Type при POST
application/json (самый популярный)
POST /api/v1/users
Content-Type: application/json
{"name": "John", "email": "john@example.com"}
application/x-www-form-urlencoded (для форм)
POST /api/v1/login
Content-Type: application/x-www-form-urlencoded
username=john&password=secret
multipart/form-data (для файлов)
POST /api/v1/upload
Content-Type: multipart/form-data
[файл и другие данные]
Тестирование POST в QA
С помощью curl
curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name": "John", "email": "john@example.com"}'
С помощью Postman
- Выбрать метод POST
- Ввести URL endpoint
- В Body выбрать JSON
- Ввести данные
- Отправить запрос
- Проверить ответ (статус код, содержимое)
С помощью Playwright (E2E тестирование)
const response = await page.request.post(
'https://api.example.com/users',
{
data: {
name: 'John',
email: 'john@example.com'
}
}
);
console.assert(response.status() === 201);
Проверочный лист для QA при тестировании POST
Положительные сценарии
- Корректные данные → 201 Created, ресурс создан
- Ресурс содержит все переданные поля
- Возвращается ID нового ресурса
- Данные сохранены в БД
Отрицательные сценарии
- Пустые обязательные поля → 400
- Неверный формат данных → 400 или 422
- Неверный тип данных → 400
- Дублирование уникального поля → 409
- Без авторизации → 401
- Без прав → 403
Граничные случаи
- Максимально длинные строки
- Спецсимволы в текстах
- Очень большие числа
- Null значения
- Пустые массивы
Безопасность
- Данные передаются по HTTPS
- Чувствительные данные не логируются
- XSS защита (спецсимволы экранируются)
- SQL injection защита
Идемпотентность и дублирование
Проблема: если пользователь нажимает кнопку дважды, POST выполняется дважды → два ресурса!
Решения:
- Idempotency Key: клиент отправляет уникальный ключ, сервер не дублирует
- Deduplication: сервер отслеживает недавние запросы и отклоняет дубли
- UI блокировка: кнопка отключается после нажатия до получения ответа
Заключение
POST — это основной метод для создания новых ресурсов в REST API. QA инженер должен понимать как работает POST, какие статус коды он возвращает, и как правильно его тестировать. POST часто используется в веб и мобильных приложениях для регистрации, создания заказов, отправки комментариев и других операций создания данных.