Часто в строке запроса URL-адреса, необходимо отправить какие-то данные. При составлении URL-адреса вручную, эти данные задаются в виде пар ключ/значение в конце URL-адреса после вопросительного знака, например httpbin.org/get?key=val
. Модуль requests
позволяет передавать эти параметры в метод requests.get()
виде словаря строк, используя ключевой аргумент params
. Например, если надо передать key1=value1
и key2=value2
для GET запроса к URL-адресу httpbin.org/get
, то используйте следующий код:
>>> import requests
# подготовка дополнительных параметров для GET запроса
>>> params = {'key1': 'value1', 'key2': 'value2'}
>>> resp = requests.get('https://httpbin.org/get', params=params)
# смотрим, что URL-адрес был правильно закодирован
>>> print(resp.url)
# https://httpbin.org/get?key2=value2&key1=value1
Обратите внимание, что любой ключ словаря, значение которого равно None
, не будет добавлен в строку запроса URL-адреса.
В качестве значения словаря можно передать список дополнительных элементов URL-адреса:
>>> import requests
# ключ словаря 'key2' имеет список значений
>>> params = {'key1': 'value1', 'key2': ['value2', 'value3']}
# создаем GET запрос
>>> resp = requests.get('https://httpbin.org/get', params=params)
# смотрим полученный URL
>>> print(resp.url)
# https://httpbin.org/get?key1=value1&key2=value2&key2=value3
Как правило, в POST-запросах встает необходимость отправить некоторые закодированные в форме данные. Для этого необходимо передать словарь в аргумент data
метода requests.post()
. Словарь с данными формы будет автоматически закодирован.
Обратите внимание, что имя аргумента для передачи параметров метода requests.post()
, отличается от имени аргумента дополнительных параметров метода requests.get()
.
>>> import requests
# подготовка параметров для POST-запроса
>>> param = {'key1': 'value1', 'key2': 'value2'}
# обратите внимание, что для метода POST, аргумент для
# передачи параметров в запрос отличается от метода GET
>>> resp = requests.post("https://httpbin.org/post", data=param)
>>> print(resp.text)
# {
# ...
# "form": {
# "key2": "value2",
# "key1": "value1"
# },
# ...
# }
Аргумент data
также может иметь несколько значений для каждого ключа. Это можно сделать, передав данные либо списком кортежей, либо словарем со списками в качестве значений. Это особенно полезно, когда форма содержит несколько элементов, использующих один и тот же ключ:
>>> import requests
>>> param_tuples = [('key1', 'value1'), ('key1', 'value2')]
>>> resp1 = requests.post('https://httpbin.org/post', data=payload_tuples)
>>> param_dict = {'key1': ['value1', 'value2']}
>>> resp2 = requests.post('https://httpbin.org/post', data=payload_dict)
>>> print(resp1.text)
# {
# ...
# "form": {
# "key1": [
# "value1",
# "value2"
# ]
# },
# ...
# }
>>> resp1.text == resp2.text
# True