python - Python请求库:json.dumps的使用
问题描述
潜在的新手问题,但长期以来一直困扰着我。
在很多 Python 教程中,我看到了非常相似的片段来将某些内容发布到 REST API
import json
import requests
url = 'https://api.blabla.com/v1'
token = '1234'
headers = {
'Authorization: f'Bearer {token}',
'Content-Type: 'application/json'
}
body = {
'name': 'Test name'
}
my_response = requests.post(url, headers=headers, data=json.dumps(body)).json()
print(my_response)
请求文档说数据对象应该收到一个字典。在上面,正文已经是一个字典,那么为什么需要使用json.dump
它,因为这基本上使它成为一个字符串(而文档说它应该是一个字典)。
那么为什么不应该是:
my_response = requests.post(url, headers=headers, data=body).json()
另一方面,官方请求文档还说我们可以传递 json 参数,在这个例子中它会是(如果我们遵循文档):
my_response = requests.post(url, headers=headers, json=body).json()
但是 JSON 参数应该是一个 JSON 对象,所以如果我们这样传递正文,这意味着我们将一个 dict 对象传递给 JSON 参数,这不是文档所说的。
笔记:
解决方案
data
– 附加到请求的正文。如果提供了字典或元组列表,[(key, value)]
则会进行表单编码。https://requests.readthedocs.io/en/master/api/#requests.Request
(强调我的)
如果你传递一个 dict as data
,它将被form-encoded。如果您将 dict 作为 传递json
,它将被 JSON 序列化。该json
参数只是data=json.dumps(body)
. 为什么许多人使用后者而不是前者……谁知道呢。
推荐阅读
- r - 在 dplyr 过滤器后保留 rowID
- asp.net-core - 已从 Asp.Net Core 中删除了 Syncfusion.EJ2.HtmlMVCExtension
- mysql - 将匹配“数字”的相对记录分配给mysql group_concat函数中的每条记录
- c# - 如何使用 json-ld.net 创建 JSON-LD 结构化数据 - 代码示例
- laravel - 如何从 Laravel 中的完整数组中获取每一行中的元素?
- excel - 从另一个单元格值突出显示单元格(动态范围)
- python - 如何清理此数据类型对象并将其转换为类型 float 维护 Null 和 NaN
- java - LWJGL 对象未正确旋转
- algorithm - 找到一组递归结果的最小值
- python - 如何从文本文件加载 JSON 数据,然后在 python 中添加到该数据?