为什么我不能使用Python的`requests`库在POST请求中发送`None`作为数据?

Eli*_*ICA 5 python http-post python-requests

似乎当一个键data的值为None,键不包含在请求中.

>>> req = requests.Request('POST', 'http://google.com', data=dict(a=None, b=1))
>>> req.prepare().body
'b=1'
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我期待一个空字符串,或类似于渲染的json.dumps(d)地方.我确信这是一个很好的理由 - 只是好奇它是什么.(我能想到的一件事是,可能没有POST请求的编码或可用 - 这是真的吗?)NonenullnullNone

另外好奇 - 为什么requests默默地忽略这些数据而不是抛出错误?

Bar*_*mar 7

将字典元素设置None为如何明确表示您不希望将该参数发送到服务器.

我在requests.Request()文档中找不到具体提到的内容,但在URL传递参数时它说:

请注意,任何值为None的字典键都不会添加到URL的查询字符串中.

显然,它POST也会对请求使用一致的逻辑.

如果要发送空字符串,请将字典元素设置为空字符串而不是None.


小智 6

我有类似的空白值问题,这是我的解决方法。我将数据作为 json 字符串发送,并将内容类型标头设置为 application/json。这似乎按预期发送了整个数据。花了相当长的时间才弄清楚。希望这对某人有帮助。

import requests
import json

header = {"Content-Type":"application/json"}

data = {
    "xxx": None,
    "yyy": "http://",
    "zzz": 12345
    }

res = requests.post('https://httpbin.org/post', 
                    data=json.dumps(data), headers=header)

obj = json.loads(res.text)

print obj['json']
Run Code Online (Sandbox Code Playgroud)