Всегда ли в HTTP-запросе есть тело
Что проверяют
Знаете ли вы HTTP глубже таблички «GET без тела, POST с телом» и можете ли превратить это знание в тест-кейсы. Следом часто спрашивают, что сделает сервер, если отправить тело в GET, и как это проверить.
Как отвечать
Короткий ответ: нет, тело необязательно. Запрос состоит из стартовой строки, заголовков и необязательного тела. О наличии тела сервер узнаёт по заголовкам Content-Length или Transfer-Encoding: chunked, а не по методу.
- GET, HEAD, DELETE: спецификация HTTP (RFC 9110) не запрещает им тело, но и не задаёт ему смысла. Сервер вправе его проигнорировать или отклонить, а прокси и CDN иногда молча отбрасывают. Браузерный
fetchвовсе не даст отправить GET с телом и броситTypeError. Бывают исключения по договорённости: поиск в Elasticsearch принимает запрос в теле GET; - POST, PUT, PATCH: тело ожидается, но и тут оно может быть пустым.
POSTсContent-Length: 0для команды вроде «отправить письмо повторно» вполне корректен; - ответы: тела нет у ответа на
HEAD, у статусов204и304и у всех1xx. Путают часто именно это: HEAD не получает тело в ответе, а про тело запроса это ничего не говорит.
Для тестировщика отсюда вытекают проверки: GET с телом (сервер игнорирует его или отвечает 400, но не падает с 500), POST без тела и с пустым JSON {}, расхождение Content-Length с реальной длиной, неверный Content-Type при корректном теле (ожидаем 415). Всё это удобно гонять в Postman или через curl -X GET -d '{"q":1}'.
Где спотыкаются
Говорят «у GET тела быть не может». Технически отправить можно, вопрос лишь в том, что с ним сделают сервер и промежуточные узлы.
Смешивают запрос и ответ. На вопрос про тело запроса рассказывают, что HEAD возвращает только заголовки.
Считают, что POST обязан иметь тело, и заводят баг на пустой POST, хотя для действий без параметров это нормальная практика. Правильнее сверяться с контрактом API в Swagger или OpenAPI.