HTTP-запросы Python: GET, POST, PUT, DELETE с requests

Раздел: Сетевое программирование -> HTTP

Основы библиотеки requests и методы GET, POST, PUT, DELETE

Библиотека requests позволяет выполнять HTTP-запросы в Python простым и интуитивным способом. Для работы с методами GET, POST, PUT, DELETE используются соответствующие функции модуля:

import requests

response_get = requests.get('https://api.example.com/resource')
response_post = requests.post('https://api.example.com/resource', data={'key': 'value'})
response_put = requests.put('https://api.example.com/resource/1', data={'key': 'new_value'})
response_delete = requests.delete('https://api.example.com/resource/1')

Python requests get (get-запрос через requests в python)

Каждый вызов возвращает объект Response, который содержит статус-код, заголовки, тело ответа и другую информацию. Статус-код проверяется через response.status_code, а текст ответа через response.text или response.json() для JSON.

Как выполнить GET-запрос с параметрами строки запроса?

Параметры передаются через аргумент params в виде словаря:

params = {'page': 2, 'limit': 10}
response = requests.get('https://api.example.com/items', params=params)
print(response.url)  # https://api.example.com/items?page=2&limit=10

Get html python (получение html-содержимого через http в python)

Как отправить POST-запрос с JSON?

Для JSON используйте аргумент json (библиотека автоматически сериализует словарь):

data = {'name': 'Alice', 'age': 30}
response = requests.post('https://api.example.com/users', json=data)

Url запрос python (работа с url в python)

Заголовок Content-Type устанавливается в application/json автоматически.

Как передать заголовки в запросе?

Словарь заголовков передаётся через аргумент headers:

headers = {'Authorization': 'Bearer token123', 'Accept': 'application/json'}
response = requests.get('https://api.example.com/protected', headers=headers)

Python urllib request (отправка запросов с помощью urllib.request в python)

Как использовать базовую аутентификацию?

Используйте аргумент auth с кортежем (логин, пароль):

response = requests.get('https://api.example.com/login', auth=('user', 'pass'))

Files upload python (загрузка файлов на сервер с помощью python (requests, flask))

Библиотека автоматически формирует заголовок Authorization с Basic-кодированием.

Как сохранять сессию и куки между запросами?

Объект Session поддерживает общие настройки и сохраняет куки:

session = requests.Session()
session.headers.update({'User-Agent': 'MyApp'})
session.get('https://httpbin.org/cookies/set?name=value')
response = session.get('https://httpbin.org/cookies')
print(response.json())  # {'cookies': {'name': 'value'}}

Python requests method (методы http-запросов в python (get, post, put, delete) с requests)

Как обрабатывать ошибки неуспешных запросов?

Метод raise_for_status() выбрасывает исключение при статусе 4xx или 5xx:

try:
    response = requests.get('https://httpbin.org/status/404')
    response.raise_for_status()
except requests.exceptions.HTTPError as err:
    print(f'Ошибка: {err}')

Python request data (извлечение данных из http-запроса (request) в python)

Как установить таймаут запроса?

Аргумент timeout задаёт максимальное время ожидания (в секундах):

try:
    response = requests.get('https://httpbin.org/delay/5', timeout=3)
except requests.exceptions.Timeout:
    print('Запрос превысил таймаут')

Типичные проблемы и их решения

  • Кодировка ответа: если текст содержит не-ASCII символы, requests определяет кодировку из заголовка или тела. Принудительная установка: response.encoding = 'utf-8'.
  • SSL-сертификаты: для игнорирования ошибок сертификата (не рекомендуется в production) используйте verify=False. Для указания своего CA-пакета передайте путь в verify.
  • Redirects: по умолчанию requests следуют редиректам. Отключить можно через allow_redirects=False.
  • Ошибка соединения: проверьте доступность хоста, наличие интернета. Исключение requests.exceptions.ConnectionError.
  • Большие ответы: для потоковой загрузки используйте stream=True и итерируйте по response.iter_content().
- Python requests параметры (передача параметров в get/post запросах requests в python)
- Request session python (использование session в библиотеке requests (куки, заголовки) в python)
- Python requests timeout (установка таймаута для http-запроса (requests timeout) в python)

Расширенные примеры работы с HTTP-запросами

1. Потоковая загрузка файла

Использование stream=True для обработки больших ответов по частям:

Пример
import requests

url = 'https://example.com/largefile.zip'
response = requests.get(url, stream=True)
response.raise_for_status()

with open('file.zip', 'wb') as f:
    for chunk in response.iter_content(chunk_size=8192):
        if chunk:
            f.write(chunk)
Файл постепенно сохраняется на диск, не занимая много оперативной памяти.

2. Загрузка файла на сервер (multipart/form-data)

Отправка файла с помощью аргумента files:

Пример
import requests

files = {'file': ('report.txt', open('report.txt', 'rb'), 'text/plain')}
response = requests.post('https://httpbin.org/post', files=files)
print(response.json()['files'])
{
  "file": "data:text/plain;base64,<содержимое файла>"
}

3. Повторные попытки при сбоях (Retry)

Использование requests.adapters.HTTPAdapter с политикой повторных попыток:

Пример
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

session = requests.Session()

retries = Retry(total=3, backoff_factor=0.1, status_forcelist=[500, 502, 503, 504])
adapter = HTTPAdapter(max_retries=retries)
session.mount('http://', adapter)
session.mount('https://', adapter)

try:
    response = session.get('https://httpbin.org/status/500')
    response.raise_for_status()
except requests.exceptions.RetryError:
    print('Все попытки неудачны')
После трех неудачных попыток (с задержками) возникает исключение RetryError.

4. Использование сессии для размещения входа (login)

Сохраняем куки после аутентификации и используем их в последующих запросах:

Пример
session = requests.Session()

login_data = {'username': 'admin', 'password': 'secret'}
session.post('https://example.com/login', data=login_data)

# Теперь куки хранятся в сессии
response = session.get('https://example.com/dashboard')
print(response.text)
Страница dashboard отображается только авторизованным пользователям.

5. Работа с API, требующем токен (Bearer)

Автоматическое добавление заголовка Authorization через сессию:

Пример
session = requests.Session()
session.headers.update({'Authorization': 'Bearer my_api_token'})

response = session.get('https://api.github.com/user')
print(response.json()['login'])
Возвращается информация о текущем пользователе (если токен валидный).

6. Прокси для обхода ограничений

Настройка прокси-сервера через аргумент proxies:

Пример
proxies = {'http': 'http://proxy.example.com:8080', 'https': 'http://proxy.example.com:8080'}
response = requests.get('https://httpbin.org/ip', proxies=proxies)
print(response.json())

# Для аутентификации прокси: 'http://user:pass@proxy.example.com:8080'
{
  "origin": "IP-адрес прокси"
}

7. Асинхронные запросы с использованием ThreadPoolExecutor

Если нужно отправить много запросов параллельно, можно применить пул потоков:

Пример
from concurrent.futures import ThreadPoolExecutor
import requests

urls = ['https://httpbin.org/get'] * 5

def fetch(url):
    return requests.get(url).json()

with ThreadPoolExecutor(max_workers=3) as executor:
    results = list(executor.map(fetch, urls))

print(len(results))  # 5
Все пять запросов выполняются параллельно, сокращая общее время.

8. Обработка переадресаций вручную

Отключаем автоматическое следование редиректам и анализируем Location:

Пример
response = requests.get('https://httpbin.org/redirect/3', allow_redirects=False)
print(response.status_code)  # 302
print(response.headers['Location'])  # /redirect/2
Можно реализовать собственную логику редиректа, например ограничить количество переходов.

9. Использование метода DELETE с телом запроса

Хотя HTTP DELETE обычно не требует тела, некоторые API принимают JSON-данные:

Пример
response = requests.delete('https://httpbin.org/delete', json={'reason': 'test'})
print(response.json()['json'])
{
  "reason": "test"
}

10. Отправка PUT-запроса для полного обновления ресурса

Пример
import requests

resource = {'id': 1, 'name': 'Updated Item', 'price': 99.99}
response = requests.put('https://api.example.com/items/1', json=resource)
if response.status_code == 200:
    print('Ресурс обновлён')
Обычно PUT заменяет весь ресурс данными из тела запроса.

Эти примеры охватывают основные и продвинутые сценарии использования библиотеки requests. Каждый фрагмент кода можно адаптировать под конкретную задачу.

Методы HTTP-запросов в Python (GET, POST, PUT, DELETE) с requests - comments

En
Python requests method (python)