Ответ
Формат данных в теле POST-запроса определяется заголовком Content-Type. Основные форматы:
-
application/x-www-form-urlencoded- Что: Стандартный формат для HTML-форм. Данные кодируются в виде пар
ключ=значение, объединенных амперсандом&. - Пример тела:
username=johndoe&password=secret123 - Когда использовать: Простая отправка текстовых данных из форм.
- Что: Стандартный формат для HTML-форм. Данные кодируются в виде пар
-
multipart/form-data- Что: Используется для отправки бинарных данных, например, файлов. Тело разделяется на части (parts) границей (boundary).
-
Пример (упрощенно):
--boundary123 Content-Disposition: form-data; name="file"; filename="report.pdf" Content-Type: application/pdf [бинарное содержимое файла] --boundary123 Content-Disposition: form-data; name="description" Quarterly report --boundary123-- - Когда использовать: Загрузка файлов на сервер.
-
application/json- Что: Наиболее распространенный формат для современных RESTful API. Передает структурированные данные в формате JSON.
- Пример тела:
{"title": "New Post", "body": "Content here", "tags": ["tech", "api"]} - Когда использовать: Взаимодействие с JSON API.
-
text/plain,application/xml,text/html- Что: Специализированные форматы для передачи простого текста, XML или HTML-разметки.
Практический пример отправки JSON с помощью Python (библиотека requests):
import requests
url = "https://api.example.com/data"
data = {"key": "value"}
# Библиотека requests автоматически устанавливает заголовок Content-Type: application/json
response = requests.post(url, json=data)
# Или явно через параметр `data` и заголовки
response = requests.post(url, data=json.dumps(data), headers={"Content-Type": "application/json"}) Ответ 18+ 🔞
Давай разжую тебе эту тему про Content-Type, а то, глядя на некоторых, кажется, они думают, что это просто какая-то галочка в Postman'е, которую можно наобум тыкать.
Вот смотри, когда ты шлёшь POST-запрос, сервер — он не телепат, ёпта. Ему надо понять, что за хуйню ты ему в тело засунул. Для этого и нужен этот самый заголовок. Без него — как прийти в гости с полным пакетом, но молча поставить его на стол и ждать, что хозяин догадается, что там борщ, а не кирпичи.
1. application/x-www-form-urlencoded — старый добрый дед.
Это как заполнить бумажную анкету ручкой. Данные превращаются в такую простыню: имя=Вася&возраст=30&кличка=Босс. Всё кодируется, пробелы становятся плюсами, спецсимволы — процентами. Используется в обычных HTML-формах, где файлов нет. Просто, понятно, но для бинарного говна — полная жопа.
2. multipart/form-data — тяжёлая артиллерия для файлов.
Вот тут начинается магия. Когда нужно отправить и текст, и, скажем, твоё эпичное селфи с котом, используют это. Тело запроса делится на куски (parts), каждый со своими заголовками. Между ними — уникальная граница (boundary), типа --boundary123. Выглядит это страшновато, но зато работает.
--boundary123
Content-Disposition: form-data; name="avatar"; filename="my_cool_cat.jpg"
Content-Type: image/jpeg
[тут байты твоей фотки, где кот смотрит на тебя с презрением]
--boundary123
Content-Disposition: form-data; name="comment"
Лучший котейка!
--boundary123--
Браузеры это генерируют сами, когда в форме есть <input type="file">.
3. application/json — король современных API.
Вот это, блядь, красота. Все эти ваши REST'ы, GraphQL'ы (ну ладно, не все) жрут именно JSON. Данные структурированные, вложенные, человекочитаемые. Серверу легко распарсить.
{
"user": {
"login": "vasyok",
"prefs": {"theme": "dark", "notifications": true}
}
}
Главное — не забыть заголовок поставить, а то сервер будет пытаться прочитать JSON как ключ=значение и офигеет.
4. Остальное (text/plain, xml и т.д.) — для особых случаев.
Ну, text/plain — просто текст, без заморочек. application/xml — если ты живёшь в двухтысячных или работаешь с SOAP (мои соболезнования). text/html — ну, если ты прямо HTML-код шлёшь, бывает и такое.
А теперь, чтобы не быть просто болтуном, смотри как это в коде выглядит на Python с requests:
import requests
import json
url = "https://api.example.com/hook"
data = {"message": "Привет, сервер, я твой отец!"}
# Самый простой и правильный способ для JSON. Библиотека сама всё сделает:
# 1. Преобразует dict в JSON-строку.
# 2. Поставит заголовок Content-Type: application/json.
response = requests.post(url, json=data)
print(response.status_code)
# Способ для мазохистов или если нужно слать уже готовую JSON-строку.
# Тут надо ВСЁ делать самому: и преобразовывать, и заголовок ставить.
json_string = json.dumps(data)
response_manual = requests.post(url, data=json_string, headers={"Content-Type": "application/json"})
Видишь разницу? В первом случае requests — умный мужик, он всё за тебя сделает. Во втором — ты сам всё контролируешь, и если забудешь заголовок, сервер тебя пошлёт нахуй с ошибкой 400 или 415. Выбирай сам, но я бы на твоём месте не выёбывался и использовал json=.