Полный обзор методов запросов в requests: от базовых до продвинутых

Раздел: Python -> Requests

Типы запросов в библиотеке requests

Библиотека requests предоставляет простые и интуитивно понятные функции для каждого HTTP метода. Основной способ выполнения запроса - использование соответствующей функции: get, post, put, delete, patch, head, options. Каждая функция принимает URL и дополнительные параметры, возвращая объект Response. Это наиболее эффективное решение для типовых задач.

import requests

# GET запрос
response = requests.get('https://api.example.com/items')
data = response.json()

# POST запрос с JSON
response = requests.post('https://api.example.com/items', json={'name': 'new item'})

# PUT запрос
response = requests.put('https://api.example.com/items/1', json={'name': 'updated'})

# DELETE запрос
response = requests.delete('https://api.example.com/items/1')

# PATCH запрос
response = requests.patch('https://api.example.com/items/1', json={'name': 'patched'})

# HEAD запрос (только заголовки)
response = requests.head('https://api.example.com/items')

# OPTIONS запрос (какие методы разрешены)
response = requests.options('https://api.example.com/items')

Python 2 requests (библиотека requests в python 2)

Каждый вызов создаёт новый объект сессии, обрабатывает перенаправления, куки и т.д. Этот подход подходит для разовых запросов или простых скриптов.

Как вызвать любой HTTP метод без запоминания отдельных функций?

Универсальная функция requests.request(method, url, ...) позволяет указать метод строкой. Это удобно, когда метод выбирается динамически.

import requests

method = 'POST'  # может быть переменной
url = 'https://api.example.com/items'
response = requests.request(method, url, json={'key': 'value'})
print(response.status_code)

Python 3 requests (библиотека requests в python 3)

Все остальные параметры (headers, data, params) передаются так же, как и в специализированных функциях.

Типичная ошибка: указать неподдерживаемый метод (например, 'FOO'). Библиотека выбросит исключение InvalidURL или ValueError в зависимости от версии.

Решение: проверять метод перед вызовом или обрабатывать исключение.

Как объединить несколько запросов с общими настройками (куки, заголовки, таймаут)?

Использование объекта requests.Session() позволяет сохранять состояние между запросами: куки, параметры аутентификации, заголовки. Это подходит для сценариев, где нужно выполнить последовательность запросов (например, авторизация -> получение данных).

import requests

session = requests.Session()
session.headers.update({'User-Agent': 'MyApp/1.0'})
session.auth = ('user', 'pass')

# Первый запрос - авторизация
response = session.post('https://api.example.com/login', json={'username': 'user', 'password': 'pass'})
# Куки сохраняются автоматически

# Второй запрос - получение защищённых данных
response = session.get('https://api.example.com/protected')
print(response.json())

Python requests url (выполнение запроса по url с помощью requests в python)

Типичная ошибка: забыть закрыть сессию. Это может привести к утечкам соединений при частом создании сессий.

Решение: использовать контекстный менеджер with requests.Session() as session: ..., который автоматически закроет сессию.

Как полностью контролировать отправку запроса, например, добавить собственный поток данных?

Объект PreparedRequest позволяет создать запрос пошагово, задать тело, заголовки, затем отправить через сессию. Это даёт максимальную гибкость, например, для отправки больших файлов или подписывания запроса.

import requests

session = requests.Session()

# Создаём подготовленный запрос
req = requests.Request('POST', 'https://api.example.com/upload',
                       files={'file': open('photo.jpg', 'rb')})
prepped = session.prepare_request(req)

# Можно модифицировать заголовки после подготовки
prepped.headers['X-Custom'] = 'value'

# Отправляем
response = session.send(prepped)
print(response.status_code)

Типичная ошибка: модификация PreparedRequest после отправки (бессмысленно).

Решение: перед отправкой проверять все поля.

Цели и случаи использования каждого варианта

  • Отдельные функции (get, post и т.д.) - для простых, независимых запросов, когда не нужны общие настройки.
  • requests.request() - когда метод запроса определяется динамически (например, из пользовательского ввода или конфигурации).
  • Session - для последовательных запросов с сохранением состояния (авторизация, сессионные куки, общие заголовки).
  • PreparedRequest - для тонкой настройки запроса перед отправкой, интеграции с другими библиотеками (например, аутентификация через HMAC).
- Python requests codes (коды ответов http в python requests)
- Python module requests (модуль requests в python)
- Python requests response (обработка ответа requests в python)

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

GET с параметрами и заголовками

Пример
import requests

params = {'search': 'python', 'page': 2}
headers = {'Accept': 'application/json', 'Authorization': 'Bearer token123'}
response = requests.get('https://api.example.com/search', params=params, headers=headers, timeout=5)
print(response.url)  # https://api.example.com/search?search=python&page=2
print(response.status_code)
print(response.json())
# Пример результата
https://api.example.com/search?search=python&page=2
200
{'results': [...], 'total': 42}

POST с отправкой JSON и обработкой ошибок

Пример
import requests

data = {'title': 'Новая статья', 'content': 'Текст'}
try:
    response = requests.post('https://api.example.com/posts', json=data)
    response.raise_for_status()  # вызовет исключение для 4xx/5xx
    print('Успешно создано:', response.json().get('id'))
except requests.exceptions.HTTPError as err:
    print(f'HTTP ошибка: {err}')
except requests.exceptions.RequestException as err:
    print(f'Ошибка соединения: {err}')
Успешно создано: 123

PUT для обновления ресурса

Пример
import requests

update_data = {'title': 'Изменённый заголовок'}
response = requests.put('https://api.example.com/posts/123', json=update_data)
print(response.status_code, response.reason)
if response.ok:
    print('Обновление выполнено')
else:
    print('Ошибка:', response.text)
200 OK
Обновление выполнено

DELETE с подтверждением

Пример
import requests

response = requests.delete('https://api.example.com/posts/123')
if response.status_code == 204:
    print('Ресурс удалён (нет содержимого)')
elif response.status_code == 200:
    print('Удалено, ответ:', response.json())
else:
    print('Не удалось удалить, код:', response.status_code)
Ресурс удалён (нет содержимого)

PATCH для частичного обновления

Пример
import requests

patch_data = {'views': 150}
response = requests.patch('https://api.example.com/posts/123', json=patch_data)
print(response.json())  # {'id': 123, 'views': 150, ...}
{'id': 123, 'views': 150, 'title': 'Изменённый заголовок', ...}

HEAD для получения метаданных

Пример
import requests

response = requests.head('https://api.example.com/posts/123')
print('Content-Type:', response.headers.get('Content-Type'))
print('Content-Length:', response.headers.get('Content-Length'))
# У HEAD запроса тело отсутствует, response.text пуст
Content-Type: application/json
Content-Length: 256

OPTIONS для выяснения разрешённых методов

Пример
import requests

response = requests.options('https://api.example.com/posts')
allowed = response.headers.get('Allow', '')
print('Разрешённые методы:', allowed)
# Альтернативно: можно распарсить Allowed-Methods или Allow
Разрешённые методы: GET, POST, HEAD, OPTIONS

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

Пример
import requests

with requests.Session() as session:
    # Логин
    login_resp = session.post('https://httpbin.org/post', data={'username': 'user', 'password': 'pass'})
    # Защищённая страница (куки автоматически передаются)
    profile_resp = session.get('https://httpbin.org/cookies')
    print(profile_resp.json())
{
  "cookies": {"session": "abc123"}
}

PreparedRequest с кастомной авторизацией

Пример
import requests
from requests.auth import HTTPBasicAuth

url = 'https://httpbin.org/basic-auth/user/pass'

# Создаём запрос с базовой аутентификацией
req = requests.Request('GET', url, auth=HTTPBasicAuth('user', 'pass'))
prepped = req.prepare()  # или через сессию: session.prepare_request(req)

print(prepped.headers['Authorization'])  # Basic ...

# Отправляем через сессию
with requests.Session() as session:
    response = session.send(prepped)
    print(response.status_code, response.json())
Basic dXNlcjpwYXNz
200 {'authenticated': True, 'user': 'user'}

Типы запросов в requests Python - comments

En
Python types requests (python)