Какие основные форматы данных можно использовать в теле POST-запроса HTTP?

Ответ

Формат данных в теле POST-запроса определяется заголовком Content-Type. Основные форматы:

  1. application/x-www-form-urlencoded

    • Что: Стандартный формат для HTML-форм. Данные кодируются в виде пар ключ=значение, объединенных амперсандом &.
    • Пример тела: username=johndoe&password=secret123
    • Когда использовать: Простая отправка текстовых данных из форм.
  2. 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--
    • Когда использовать: Загрузка файлов на сервер.
  3. application/json

    • Что: Наиболее распространенный формат для современных RESTful API. Передает структурированные данные в формате JSON.
    • Пример тела: {"title": "New Post", "body": "Content here", "tags": ["tech", "api"]}
    • Когда использовать: Взаимодействие с JSON API.
  4. 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=.