Из чего состоит POST-запрос в HTTP?

Ответ

POST-запрос — это основной метод HTTP для отправки данных на сервер с целью создания или обновления ресурса. Как тестировщик, я разбираю его на компоненты для составления корректных и некорректных тестовых сценариев.

Структура POST-запроса:

  1. Стартовая строка (Request Line): Содержит метод (POST), путь к ресурсу (/api/users) и версию протокола (HTTP/1.1).
  2. Заголовки (Headers): Критически важны для интерпретации тела запроса сервером.
    • Content-Type: Обязательный для POST. Указывает формат тела. Например:
      • application/json — для JSON.
      • application/x-www-form-urlencoded — для данных формы.
      • multipart/form-data — для загрузки файлов.
    • Content-Length: Размер тела в байтах.
    • Authorization: Для аутентификации.
  3. Тело запроса (Request Body): Сами отправляемые данные. Формат должен строго соответствовать Content-Type.
  4. Параметры строки запроса (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), а принёс свою банку с краской, чтобы что-то на этой витрине нарисовать. Или испортить, если тестировщик.

Из чего эта хрень состоит:

  1. Стартовая строка: Тут всё просто, как три копейки. Метод (POST), куда стучимся (/api/users) и на каком языке с сервером говорим (HTTP/1.1). Без этого нихуя не полетит.
  2. Заголовки (Headers): Вот тут уже начинается магия, а иногда и пиздец, если накосячить. Это как инструкция для сервера: "чувак, смотри, я тебе сейчас подсуну, но это вот в такой упаковке".
    • Content-Type: ОБЯЗАТЕЛЬНАЯ штука для POST, ядрёна вошь! Без неё сервер посмотрит на твои данные и скажет "чё это за манда с ушами?". Указываешь формат: application/json — это для красивого JSON'а, application/x-www-form-urlencoded — старый добрый формат из веба, multipart/form-data — когда файлы тащишь, фотки котиков или что там.
    • Content-Length: Просто размер твоего "подарка" в байтах. Чтоб сервер знал, когда остановиться читать.
    • Authorization: Ну это если тебе нужно пройти в закрытый клуб, предъяви токен или логин-пароль.
  3. Тело запроса (Body): А вот это и есть сама банка с краской. Данные, которые ты хочешь запихнуть в систему. Главное — чтобы формат тела строго совпадал с тем, что ты в Content-Type наобещал. Если сказал "json", а прислал XML — будет тебе хиросима, сервер тебя пошлёт нахуй с ошибкой 400.
  4. Параметры в 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 — это уже действие, "создай что-то" или "обнови". Он меняет состояние на сервере, поэтому к нему и подход особый, и тестировать его надо со всех сторон, включая самые извращённые.