Как в Python сформировать payload для HTTP-запроса

«Как в Python сформировать payload для HTTP-запроса» — вопрос из категории Сети, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Payload (полезная нагрузка) — это данные, отправляемые на сервер в теле HTTP-запроса, чаще всего для методов POST, PUT, PATCH. В Python для этого обычно используется библиотека requests.

Формат payload зависит от того, что ожидает сервер (Content-Type).

1. JSON Payload (для API)

Самый распространенный формат для взаимодействия с REST API. Используйте параметр json в requests, который автоматически сериализует словарь Python в JSON-строку и установит заголовок Content-Type: application/json.

Пример:

import requests

url = "https://api.example.com/users"

# Payload в виде словаря Python
payload = {
    "name": "John Doe",
    "email": "john.doe@example.com",
    "is_active": True,
    "roles": ["user", "reader"]
}

try:
    response = requests.post(url, json=payload)
    response.raise_for_status() # Проверка на HTTP-ошибки (4xx или 5xx)
    print("Пользователь создан:", response.json())
except requests.exceptions.RequestException as e:
    print(f"Ошибка запроса: {e}")

2. Form Data (как из HTML-формы)

Для отправки данных в формате application/x-www-form-urlencoded (стандартный для HTML-форм) используется параметр data.

Пример:

import requests

url = "https://example.com/login"

payload = {
    'username': 'myuser',
    'password': 'mypassword'
}

response = requests.post(url, data=payload)
print(response.text)

Ключевые моменты:

  • json=...: Предпочтительный способ для API. Безопасно обрабатывает сериализацию и заголовки.
  • data=...: Для отправки данных формы. Если передать словарь, он будет закодирован как form-urlencoded. Если передать строку, она отправится как есть.
  • Ручная сериализация: В редких случаях можно вручную создать JSON-строку с помощью json.dumps() и передать ее в data, не забыв указать заголовок Content-Type.