Requests.post: примеры (PYTHON)
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() # Вызовет исключение, если ответ не JSONJSONDecodeError: 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 для пустого телаРасширенные примеры
Отправка данных с кастомными заголовками и базовой аутентификацией:
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 между запросами:
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'}}Потоковая загрузка большого файла на сервер:
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)Обработка ответа как потока для большого тела:
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 символов каждой строки