Requests.post: примеры (PYTHON)

Отправка POST-запросов через функцию requests.post в Python
Раздел: HTTP-клиенты, POST-запросы
requests.post(url, data, json, kwargs): requests.Response

Функция requests.post() из библиотеки Requests используется для отправки HTTP POST-запросов на указанный URL. Этот метод применяется, когда необходимо передать данные на сервер для создания или обновления ресурса, например, при отправке форм, загрузке файлов или взаимодействии с API.

Описание и параметры

Основная сигнатура функции: requests.post(url, data=None, json=None, **kwargs).

  • url (строка, обязательный): Адрес, на который отправляется запрос.
  • data (словарь, список кортежей, байты или файловый объект, необязательный): Данные для отправки в теле запроса. Обычно используется для отправки форм (application/x-www-form-urlencoded).
  • json (объект, необязательный): JSON-сериализуемый объект Python, который отправляется в теле запроса с заголовком Content-Type: application/json.
  • **kwargs: Дополнительные аргументы, которые могут передаваться в функцию requests.request(). К ним относятся params, headers, cookies, files, auth, timeout, allow_redirects, proxies, verify, stream, cert.

Функция возвращает объект Response, который содержит ответ сервера. Основные атрибуты ответа: status_code (код состояния HTTP), headers (заголовки ответа), text (текст ответа в Unicode), content (содержимое ответа в байтах), json() (метод для десериализации JSON-ответа).

Простые примеры использования

Отправка данных формы:

import requests

response = requests.post('https://httpbin.org/post', data={'key': 'value'})
print(response.status_code)
print(response.text)
200
{
  "args": {}, 
  "data": "", 
  "form": {
    "key": "value"
  }, 
  ...
}

Отправка JSON данных:

import requests

response = requests.post('https://httpbin.org/post', json={'key': 'value'})
print(response.status_code)
print(response.json())
200
{'args': {}, 'data': '{"key": "value"}', 'form': {}, ...}

Отправка файла:

import requests

files = {'file': open('report.xls', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)
print(response.status_code)
200

Похожие функции в Python

В стандартной библиотеке Python для отправки HTTP-запросов можно использовать модуль urllib.request, однако он менее удобен. Функция urllib.request.urlopen() требует больше кода для выполнения аналогичных задач.

from urllib import request, parse

data = parse.urlencode({'key': 'value'}).encode()
req = request.Request('https://httpbin.org/post', data=data)
response = request.urlopen(req)
print(response.read().decode())

Библиотека Requests предоставляет более высокоуровневый и интуитивно понятный интерфейс. Её предпочтительнее использовать в большинстве случаев для удобства и читаемости кода.

Альтернативы в других языках

JavaScript (Fetch API): Использует промисы для асинхронных запросов.

fetch('https://httpbin.org/post', {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({key: 'value'})
})
.then(response => response.json())
.then(data => console.log(data));

PHP (cURL): Требует настройки ресурса cURL.

$ch = curl_init('https://httpbin.org/post');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['key' => 'value']));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;

Java (HttpURLConnection): Многословный и низкоуровневый подход.

import java.net.HttpURLConnection;
import java.io.OutputStream;

URL url = new URL("https://httpbin.org/post");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setDoOutput(true);
String jsonInput = "{\"key\": \"value\"}";
try(OutputStream os = con.getOutputStream()) {
    byte[] input = jsonInput.getBytes("utf-8");
    os.write(input, 0, input.length);
}
int code = con.getResponseCode();

Функция в Python отличается простотой синтаксиса и широкими возможностями настройки.

Типичные ошибки

Игнорирование кодов состояния: Не проверяя статус ответа, можно пропустить ошибку.

import requests

response = requests.post('https://httpbin.org/status/404')
# Программа продолжит работу, хотя ресурс не найден
data = response.json()  # Вызовет исключение, если ответ не JSON
JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Неправильная сериализация JSON: Попытка передать несериализуемый объект в параметр json.

import requests
import datetime

response = requests.post('https://httpbin.org/post', json={'date': datetime.datetime.now()})
TypeError: Object of type datetime is not JSON serializable

Таймауты при долгом ответе: Отсутствие параметра timeout может привести к зависанию.

import requests

try:
    response = requests.post('https://httpbin.org/delay/10', timeout=5)
except requests.exceptions.Timeout:
    print("Запрос превысил время ожидания")
Запрос превысил время ожидания

Изменения в последних версиях

В версии 2.28.0 библиотеки Requests была удалена поддержка Python 2.7 и 3.6. Добавлена совместимость с Python 3.10 и 3.11.

Начиная с версии 2.0, в ответах Response объект json() возвращает более строгую десериализацию. Пустые ответы или ответы, содержащие null, могут вызывать исключения, если не используется параметр strict=False.

import requests

response = requests.post('https://httpbin.org/status/204')
# response.json()  # Вызовет исключение в новых версиях
data = response.json(strict=False)  # Возвращает None для пустого тела

Расширенные примеры

Отправка данных с кастомными заголовками и базовой аутентификацией:

Пример python
import requests

url = 'https://httpbin.org/post'
headers = {'User-Agent': 'MyApp/1.0', 'X-Custom-Header': 'value'}
auth = ('user', 'pass')
data = {'info': 'secret'}

response = requests.post(url, data=data, headers=headers, auth=auth)
print(response.request.headers)  # Показать отправленные заголовки

Использование сессии для сохранения cookies между запросами:

Пример python
import requests

with requests.Session() as session:
    session.post('https://httpbin.org/cookies/set/sessioncookie/123456789')
    response = session.post('https://httpbin.org/cookies')
    print(response.json())
{'cookies': {'sessioncookie': '123456789'}}

Потоковая загрузка большого файла на сервер:

Пример python
import requests

def generate_large_data():
    for i in range(1000):
        yield f"line {i}\n".encode()

response = requests.post('https://httpbin.org/post', data=generate_large_data(), headers={'Content-Type': 'application/octet-stream'})
print(response.status_code)

Обработка ответа как потока для большого тела:

Пример python
import requests

response = requests.post('https://httpbin.org/post', json={'large': 'data'}, stream=True)
# Тело ответа не загружается в память сразу
for line in response.iter_lines():
    if line:
        decoded_line = line.decode('utf-8')
        print(decoded_line[:100])  # Показать первые 100 символов каждой строки

питон requests.post function comments

En
Requests.post Send HTTP POST request