Передача параметров в HTTP запросах с помощью библиотеки requests

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

Передача параметров в GET и POST запросах с помощью библиотеки requests

Основной и наиболее эффективный способ передачи параметров - использование аргументов params для GET-запросов и data или json для POST-запросов. Библиотека requests автоматически кодирует параметры, обрабатывает специальные символы и корректно формирует URL.

Пример GET-запроса с параметрами:


import requests

params = {'q': 'python requests', 'page': 1, 'limit': 10}
response = requests.get('https://api.example.com/search', params=params)
print(response.url)  # https://api.example.com/search?q=python+requests&page=1&limit=10
  

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

Пример POST-запроса с данными формы (application/x-www-form-urlencoded):


import requests

data = {'username': 'user1', 'password': 'secret'}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())
  

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

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


import requests

payload = {'key': 'value', 'list': [1,2,3]}
response = requests.post('https://httpbin.org/post', json=payload)
print(response.json())
  

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

Типичные ошибки: передача параметров строкой вручную ведёт к проблемам с кодировкой, дублирование параметров (например, если передать список как значение - requests обработает его как несколько ключей). Использование params и data/json решает эти проблемы автоматически.

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

Можно указать полный URL с уже встроенными параметрами, но requests позволяет дополнить их через params. Параметры из словаря будут объединены с уже имеющимися:


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

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

Возможна коллизия, если ключи совпадают - берётся значение из params. Для добавления нескольких значений одного ключа используйте список.

Как передать параметры с одинаковыми именами (несколько значений одного ключа)?

Передайте список в качестве значения:


params = {'tag': ['python', 'requests']}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url)  # ...?tag=python&tag=requests
  

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

Таким образом можно формировать запросы с повторяющимися параметрами, например, для фильтров.

Как передать параметры через кортежи или списки кортежей?

Иногда полезно передать параметры в виде списка кортежей [(key, value), ...] - это даёт полный контроль над порядком и дублированием ключей:


params = [('key1', 'val1'), ('key2', 'val2'), ('key1', 'val3')]
response = requests.get('https://httpbin.org/get', params=params)
print(response.url)  # ...?key1=val1&key2=val2&key1=val3
  

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

Используется, когда порядок параметров важен, или когда нужно передать несколько значений для одного ключа без использования списка.

Как передать параметры в POST-запросе как строку или байты?

Можно передать строку в data, предварительно закодировав её. Это полезно, если требуется нестандартная кодировка:


import urllib.parse

data = urllib.parse.urlencode({'q': 'test & code'})
response = requests.post('https://httpbin.org/post', data=data)
print(response.json()['form'])  # {'q': 'test & code'}
  

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

Самостоятельное кодирование может привести к двойному кодированию, если data уже содержит закодированные символы. Лучше передавать словарь или кортежи.

Как передать параметры в заголовках запроса (например, для авторизации)?

Параметры не всегда передаются в URL или теле - часто они идут в заголовках. Для этого используется headers:


headers = {'Authorization': 'Bearer token123', 'X-Custom': 'value'}
response = requests.get('https://httpbin.org/headers', headers=headers)
  

Python send request (отправка http-запроса в python (requests.get/post))

Это не относится напрямую к параметрам запроса, но часто используется совместно.

Как передать параметры с помощью Session для повторного использования?

Объект Session позволяет задать параметры по умолчанию для всех запросов. Например, базовый URL или общие заголовки:


with requests.Session() as session:
    session.params = {'api_key': '12345'}
    session.headers.update({'User-Agent': 'my-app'})
    response1 = session.get('https://api.example.com/search', params={'q': 'test'})
    # итоговые параметры: api_key=12345&q=test
  

Удобно для многократных запросов к одному API с общими параметрами аутентификации.

- Request session python (использование session в библиотеке requests (куки, заголовки) в python)
- Python requests timeout (установка таймаута для http-запроса (requests timeout) в python)

Расширенные примеры передачи параметров

Ниже приведены нестандартные и углублённые сценарии использования параметров в запросах.

1. Передача вложенных параметров (например, для JSON-API)

При POST-запросе с json можно передавать любые вложенные структуры:

Пример

import requests

payload = {
    'user': {
        'name': 'Alice',
        'age': 30,
        'skills': ['Python', 'HTTP']
    },
    'active': True
}
response = requests.post('https://httpbin.org/post', json=payload)
print(response.json()['json'])
{'user': {'name': 'Alice', 'age': 30, 'skills': ['Python', 'HTTP']}, 'active': True}

2. Использование Prepared Request для тонкого контроля

Можно создать подготовленный запрос, вручную установить параметры и затем выполнить его через сессию:

Пример

from requests import Request, Session

url = 'https://httpbin.org/get'
params = {'foo': 'bar', 'baz': ['qux', 'quux']}

req = Request('GET', url, params=params)
prepared = req.prepare()
print(prepared.url)  # https://httpbin.org/get?foo=bar&baz=qux&baz=quux

s = Session()
response = s.send(prepared)
print(response.url)
https://httpbin.org/get?foo=bar&baz=qux&baz=quux

Этот подход позволяет модифицировать запрос перед отправкой, например, добавить цифровую подпись.

3. Передача параметров через кортежи с нестандартными именами (пробелы, символы)

Если имя параметра содержит пробелы или не-ASCII символы, передача словарем всё равно корректна:

Пример

params = {('имя с пробелом'): 'значение', 'special@chars': 'ok'}
# На самом деле словарь не может иметь кортеж ключом, но можно список кортежей:
params_list = [('имя с пробелом', 'значение'), ('special@chars', 'ok')]
response = requests.get('https://httpbin.org/get', params=params_list)
print(response.url)
https://httpbin.org/get?%D0%B8%D0%BC%D1%8F+%D1%81+%D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB%D0%BE%D0%BC=%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&special%40chars=ok

Обратите внимание на процентное кодирование - requests делает это автоматически.

4. Передача параметров вместе с файлами в multipart/form-data

Для POST-запроса с файлами параметры могут быть переданы отдельно:

Пример

import requests

url = 'https://httpbin.org/post'
files = {'file': ('test.txt', b'content', 'text/plain')}
data = {'description': 'sample file', 'version': 2}
response = requests.post(url, files=files, data=data)
print(response.json()['form'])
print(response.json()['files'])
{'description': 'sample file', 'version': '2'}
{'file': 'content'}

Параметры из data будут отправлены как часть multipart-формы вместе с файлом.

5. Динамическое построение параметров с помощью dict comprehension

Пример

base_params = {'app': 'myapp'}
extra = ['key1', 'key2', 'key3']
params = {**base_params, **{f'filter_{i}': f'value_{i}' for i in extra}}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url)
https://httpbin.org/get?app=myapp&filter_key1=value_key1&filter_key2=value_key2&filter_key3=value_key3

6. Передача параметров с сохранением регистра (по умолчанию ключи не меняются)

Регистр ключей сохраняется. Если нужно, чтобы ключ передавался в определённом регистре, пишите как есть:

Пример

params = {'Key': 'Value', 'ANOTHER': 'Test'}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url)
https://httpbin.org/get?Key=Value&ANOTHER=Test

7. Обработка ответа с сервера с ошибками из-за неправильного формата параметров

Иногда сервер ожидает параметры в определённом порядке или типе. Пример: сервер требует integer, но передана строка:

Пример

params = {'id': 'abc'}
response = requests.get('https://httpbin.org/get', params=params)
print(response.status_code)  # 200 - httpbin не валидирует типы
# Но реальный API может вернуть 400. Для отладки: print(response.text)

Всегда проверяйте статус код и тело ответа.

Передача параметров в GET/POST запросах requests в Python - comments

En
Python requests параметры (python)