Обязателен ли body в HTTP запросе
Что проверяют
Знаете ли вы, из чего состоит HTTP-сообщение, и не путаете ли ограничения протокола с ограничениями браузерного API. Вопрос короткий, но по нему видно, читали ли вы спецификацию или собрали представление на ощупь из практики работы с fetch.
Как отвечать
Тело необязательно. HTTP-сообщение это стартовая строка, заголовки, пустая строка и необязательное тело. Есть тело или нет, определяет не метод, а заголовки: Content-Length либо Transfer-Encoding: chunked. Нет ни того ни другого, значит тела нет.
Дальше по методам:
GET,HEAD,OPTIONS,DELETE: тела обычно нет. Спецификация его дляGETне запрещает, но семантики у такого тела нет, и промежуточный прокси или сервер вправе его отбросить. Браузер строже стандарта:fetchс телом и методомGETилиHEADбросаетTypeError, то есть на фронтенде такой запрос не собрать в принципе;POST,PUT,PATCH: тело есть почти всегда, но и оно не обязано быть.POSTс заголовкомContent-Length: 0валиден и часто используется как триггер действия без параметров.
Отдельно про ответы: у 204 и 304 тела нет по определению, и ответ на HEAD тела не содержит, хотя заголовок Content-Length в нём может стоять.
Полезно добавить фронтендовую деталь: тело влияет на CORS. Заголовок Content-Type: application/json выводит запрос из числа простых и добавляет предварительный OPTIONS.
Где спотыкаются
Говорят «в GET тело запрещено стандартом». Не запрещено, оно бессмысленно и ненадёжно. Практический вывод тот же, не использовать, но формулировка сразу показывает, откуда взялось знание.
Второе: путают тело запроса и тело ответа. Вопрос про запрос, а кандидат уходит в рассказ про то, что возвращает сервер, и проскакивает мимо кодов без тела.
Третье: выставляют Content-Type руками для FormData. Браузер сам подставляет multipart/form-data вместе с параметром boundary, а ручной заголовок затирает границу, и сервер получает тело, которое не может разобрать.