首页 > 解决方案 > 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 参数,这不是文档所说的。

笔记:

标签: pythonpython-3.x

解决方案


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). 为什么许多人使用后者而不是前者……谁知道呢。


推荐阅读