我试图将帖子数据发送到需要在json中的api。如果请求标头没有Content-type: application-json
请求失败,我会收到HTTPError: 415 Client Error: Unsupported Media Type for url
但是,如果我使用内置的json解析器,请求似乎只会在此标头中添加。尽管文档似乎表明以下内容是等效的:
>>> r = requests.post(url, data=json.dumps(payload))
>>> r = requests.post(url, json=payload)
这意味着我需要使用内置的json解析器(或手动添加Content-type头)。
但是我的帖子数据有几个Decimal字段(从api转换为json.loads(response.text, parse_float=decimal.Decimal)
保存在django DecimalField中),当使用内置请求解析器时会出错:
TypeError: Decimal('1560.35') is not JSON serialisable
有没有办法可以在请求中使用不同的json解析器(例如,处理小数的simplejson)并且仍然指定了内容类型。
答案 0 :(得分:2)
可以通过自定义函数序列化小数。
def decimal_default(obj):
if isinstance(obj, Decimal):
return str(obj)
raise TypeError
data = json.dumps(payload, default=decimal_default)
response = requests.post(
url=url,
data=data,
headers={
'Content-type': 'application/json',
}
)
答案 1 :(得分:1)
我不知道如何使用不同的json解析器,但你可以设置标题(以及内容类型)。
r = requests.post(url, data=json.dumps(payload), headers={'Content-type': 'application/json'})
# or with a session object
s = requests.Session()
s.headers['Content-Type'] = 'application/json'
s.post(url, data=json.dumps(payload))
答案 2 :(得分:0)
只需安装simplejson
,requests
将使用它来序列化小数:
$ pip3 install simplejson
这不再引发TypeError
:
>>> requests.post(url, json={'foo': Decimal('1.23')})