Модуль requests
имеет встроенный декодер JSON, на случай, если ответ приходит в виде данных JSON:
>>> import requests
# отправка GET-запроса
>>> resp = requests.get('https://api.github.com/events')
# получение данных в виде JSON
>>> resp.json()
# [{'repository': {'open_issues': 0, 'url': 'https://github.com/...
В случае сбоя декодирования JSON, метод resp.json()
вызывает исключение. Например, если ответ получает 204 (без содержимого) или если ответ содержит недопустимый формат JSON , то попытка вызова метода resp.json()
вызывает исключение simplejson.JSONDecodeError
, если установлен simplejson
, или вызывает ValueError
.
Следует отметить, что успех вызова метод resp.json()
не указывает на успех ответа. Некоторые серверы могут возвращать объект JSON при неудачном ответе (например, сведения об ошибке с HTTP 500). Такой JSON будет декодирован и возвращен. Чтобы проверить успешность запроса, используйте resp.raise_for_status()
или проверьте resp.status_code
.
Модуль requests
может отправлять данные в формате JSON. Если аргументу data
метода requests.post()
передать строку, вместо словаря dict
, то эти данные будут отправлены непосредственно.
Например, GitHub API v3 принимает JSON-кодированные данные, методами POST/PATCH:
>>> import requests
>>> import json
# целевой URL-адрес
>>> url = 'https://api.github.com/some/endpoint'
# данные в виде словаря
>>> param = {'some': 'data'}
# кодируем словарь в формат JSON
>>> json_param = json.dumps(param)
# отправка POST-запроса с данными в формате JSON
>>> resp = requests.post(url, data=json_param)
Вместо того чтобы кодировать словарь самостоятельно, также можно передать его непосредственно с помощью аргумента json
метода requests.post()
(добавленного в версии 2.4.2), и данные автоматически преобразуются в формат JSON:
>>> import requests
# целевой URL-адрес
>>> url = 'https://api.github.com/some/endpoint'
# данные в виде словаря
>>> param = {'some': 'data'}
>>> resp = requests.post(url, json=param)
Обратите внимание, что аргумент json
будет игнорироваться, если одновременно используется аргумент data
или file
.
Использование аргумента json
в запросе requests.post()
изменит заголовок Content-Type
на application/json
.