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

时间:2016-03-28 21:40:36

标签: 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'

为什么会这样?我期待一个空字符串,或类似json.dumps(d)的内容,其中None呈现为null。我确信这是一个很好的理由 - 只是好奇它是什么。 (我能想到的一件事是,POST请求可能没有nullNone的编码 - 这是真的吗?)

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

3 个答案:

答案 0 :(得分:6)

将字典元素设置为None是您明确表示不希望将该参数发送到服务器的方式。

我无法在requests.Request()文档中找到具体提及的内容,但在Passing Parameters in URLs中它说:

  

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

显然,它也为POST请求使用了一致的逻辑。

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

答案 1 :(得分:2)

我有一个空白值的类似问题,这是我的解决方法。我将数据作为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']

答案 2 :(得分:0)

前几天我遇到了同样的问题,如果用json替换数据,它应该适合你,因为现在None将被发送到正文中。

request('POST', 'http://google.com', json=dict(a=None, b=1))