Ответ
POST-запрос — это основной метод HTTP для отправки данных на сервер с целью создания или обновления ресурса. Как тестировщик, я разбираю его на компоненты для составления корректных и некорректных тестовых сценариев.
Структура POST-запроса:
- Стартовая строка (Request Line): Содержит метод (
POST), путь к ресурсу (/api/users) и версию протокола (HTTP/1.1). - Заголовки (Headers): Критически важны для интерпретации тела запроса сервером.
Content-Type: Обязательный для POST. Указывает формат тела. Например:application/json— для JSON.application/x-www-form-urlencoded— для данных формы.multipart/form-data— для загрузки файлов.
Content-Length: Размер тела в байтах.Authorization: Для аутентификации.
- Тело запроса (Request Body): Сами отправляемые данные. Формат должен строго соответствовать
Content-Type. - Параметры строки запроса (Query Parameters): Опционально. Добавляются в URL после
?(например,POST /api/log?source=test). Используются для дополнительных инструкций, а не для основных данных.
Пример тестового сценария:
Я тестирую создание заказа через POST /api/orders. Позитивный тест включает валидные заголовки и тело. Негативный тест — отправку тела в формате XML при указанном Content-Type: application/json, чтобы проверить обработку ошибок сервером.
### Пример POST-запроса для создания заказа (формат для REST-клиента)
POST https://api.shop.com/v1/orders
Content-Type: application/json
Authorization: Bearer {{auth_token}}
{
"productId": 789,
"quantity": 2,
"customerNote": "Доставить до 18:00"
}
Ключевое отличие от GET: У GET запроса нет тела, все параметры передаются только в URL. POST предназначен для операций, изменяющих состояние на сервере.
Ответ 18+ 🔞
А, ну вот, слушай, разбираем эту штуку, которая данные на сервер шлёт. POST-запрос, ёпта. Это как если ты не просто пришёл посмотреть на витрину (это GET), а принёс свою банку с краской, чтобы что-то на этой витрине нарисовать. Или испортить, если тестировщик.
Из чего эта хрень состоит:
- Стартовая строка: Тут всё просто, как три копейки. Метод (
POST), куда стучимся (/api/users) и на каком языке с сервером говорим (HTTP/1.1). Без этого нихуя не полетит. - Заголовки (Headers): Вот тут уже начинается магия, а иногда и пиздец, если накосячить. Это как инструкция для сервера: "чувак, смотри, я тебе сейчас подсуну, но это вот в такой упаковке".
Content-Type: ОБЯЗАТЕЛЬНАЯ штука для POST, ядрёна вошь! Без неё сервер посмотрит на твои данные и скажет "чё это за манда с ушами?". Указываешь формат:application/json— это для красивого JSON'а,application/x-www-form-urlencoded— старый добрый формат из веба,multipart/form-data— когда файлы тащишь, фотки котиков или что там.Content-Length: Просто размер твоего "подарка" в байтах. Чтоб сервер знал, когда остановиться читать.Authorization: Ну это если тебе нужно пройти в закрытый клуб, предъяви токен или логин-пароль.
- Тело запроса (Body): А вот это и есть сама банка с краской. Данные, которые ты хочешь запихнуть в систему. Главное — чтобы формат тела строго совпадал с тем, что ты в
Content-Typeнаобещал. Если сказал "json", а прислал XML — будет тебе хиросима, сервер тебя пошлёт нахуй с ошибкой 400. - Параметры в URL (Query): Их можно и в POST добавить, после знака вопроса. Но это так, для мелочёвки, доп. инструкций. Основную тяжесть тащит тело. Например,
POST /api/log?source=test— логируй это, но отметь, что от теста.
Как я это ломаю на работе:
Допустим, тестирую создание заказа через POST /api/orders. Нормальный, позитивный сценарий — всё по феншую, правильные заголовки, валидный JSON в теле. А потом начинается веселье. Мой любимый трюк — отправить в теле XML, а в заголовке написать Content-Type: application/json. Сервер должен адекватно обосраться и вернуть вменяемую ошибку, а не упасть в панике и накрыться медным тазом. Если упал — пишу баг, и разработчикам потом не поздоровится.
### Пример, как я создаю заказ (обычно в Postman или аналоге)
POST https://api.shop.com/v1/orders
Content-Type: application/json
Authorization: Bearer {{auth_token}}
{
"productId": 789,
"quantity": 2,
"customerNote": "Доставить до 18:00"
}
И главное, не путай с GET! GET — это просто спросить "что есть?". У него тела нет вообще, все параметры — в URL. А POST — это уже действие, "создай что-то" или "обнови". Он меняет состояние на сервере, поэтому к нему и подход особый, и тестировать его надо со всех сторон, включая самые извращённые.