Что такое payload в HTTP запросах
Что проверяют
Знаете ли вы устройство HTTP-сообщения: стартовая строка, заголовки, тело, и понимаете ли, что смысл телу придают именно заголовки. Попутно проверяют, не путаете ли вы тело с параметрами строки запроса и с полями формы.
Как отвечать
Payload это данные сообщения, идущие после заголовков; в современных редакциях спецификации то же самое называют содержимым. Тело бывает и у запроса, и у ответа. Его разбор полностью определяют заголовки: Content-Type задаёт формат и кодировку, Content-Length или заголовок кусочной передачи задают границы, Content-Encoding сообщает о сжатии.
Форматы, которые стоит назвать: JSON, кодированная форма, multipart для файлов, простой текст, произвольные двоичные данные.
r = requests.post(url, json={"email": "user@example.com"}, timeout=5)Параметр json сам выставит Content-Type и сериализует объект, data отправит форму, files соберёт multipart.
Про методы: тело переносят POST, PUT и PATCH; у DELETE оно допустимо, но промежуточные узлы его нередко отбрасывают; у GET тело не имеет определённой семантики, и полагаться на него нельзя, поэтому параметры уходят в строку запроса. У ответа тело есть почти всегда, исключения это код 204 и ответ на HEAD.
Где спотыкаются
Говорят, что тело бывает только в POST и что в GET его не бывает вовсе. Точная формулировка мягче и полезнее: тело в GET не запрещено, но лишено определённого смысла, и часть инфраструктуры его выбросит, поэтому так не делают.
Путают тело с формой и со строкой запроса. Классическая жалоба «сервер видит пустые поля» почти всегда сводится к заголовку типа, не совпавшему с тем, что реально отправлено, а вовсе не к коду обработчика.
Считают тело обычной строкой, доступной когда угодно. Это поток, который читается один раз: разобрали его в промежуточном слое и не сохранили, обработчик получит пусто, а на больших телах ещё и упрётся в серверный лимит размера.