为什么我不能使用 Python 的 `requests` 库在 POST 请求中将 `None` 作为数据发送?
Why can't I send `None` as data in a POST request using Python's `requests` library?
似乎当 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 请求没有可用的 null
或 None
编码——是这样吗?)
另外好奇 -- 为什么 requests
默默地忽略这些数据而不是抛出错误?
将字典元素设置为 None
就是您明确表示不希望将该参数发送到服务器的方式。
我在 requests.Request()
文档中找不到具体提到的内容,但在 Passing Parameters in URLs 中它说:
Note that any dictionary key whose value is None will not be added to the URL's query string.
显然它也对 POST
请求使用一致的逻辑。
如果要发送空字符串,请将字典元素设置为空字符串而不是 None
。
几天前我遇到了同样的问题,如果您将数据替换为 json 它应该适合您,因为现在 None
将在正文中发送。
request('POST', 'http://google.com', json=dict(a=None, b=1))
我遇到了类似的空白值问题,这是我的解决方法。我将数据作为 json 字符串发送,并将内容类型 headers 设置为 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']
似乎当 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 请求没有可用的 null
或 None
编码——是这样吗?)
另外好奇 -- 为什么 requests
默默地忽略这些数据而不是抛出错误?
将字典元素设置为 None
就是您明确表示不希望将该参数发送到服务器的方式。
我在 requests.Request()
文档中找不到具体提到的内容,但在 Passing Parameters in URLs 中它说:
Note that any dictionary key whose value is None will not be added to the URL's query string.
显然它也对 POST
请求使用一致的逻辑。
如果要发送空字符串,请将字典元素设置为空字符串而不是 None
。
几天前我遇到了同样的问题,如果您将数据替换为 json 它应该适合您,因为现在 None
将在正文中发送。
request('POST', 'http://google.com', json=dict(a=None, b=1))
我遇到了类似的空白值问题,这是我的解决方法。我将数据作为 json 字符串发送,并将内容类型 headers 设置为 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']