Модуль 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
.