Передача параметров в HTTP запросах с помощью библиотеки requests
Передача параметров в 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 с общими параметрами аутентификации.
Расширенные примеры передачи параметров
Ниже приведены нестандартные и углублённые сценарии использования параметров в запросах.
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)
Всегда проверяйте статус код и тело ответа.