Why can't I send `None` as data in a POST request using Python's `requests` library?
Solution 1
Setting a dictionary element to None
is how you explicitly say that you don't want that parameter to be sent to the server.
I can't find this mentioned specifically in the requests.Request()
documentation, but in Passing Parameters in URLs it says:
Note that any dictionary key whose value is None will not be added to the URL's query string.
Obviously it uses consistent logic for POST
requests as well.
If you want to send an empty string, set the dictionary element to an empty string rather than None
.
Solution 2
I had similar issue with a blank value and this was my workaround. I sent the data as json string and set content type headers as application/json. This seems to send the whole data across as expected. Took quite some time to figure out. Hope this helps someone.
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']
Solution 3
I had the same question few days ago and if you replace data with json it should work for you, as now None
will be sent in the body.
request('POST', 'http://google.com', json=dict(a=None, b=1))
Eli Rose
Hi! I got a ton of reputation for this question. But I don't think I deserved that much -- the problem is from V.I. Arnold.
Updated on June 21, 2022Comments
-
Eli Rose almost 2 years
It seems that when a key in
data
has a value ofNone
, the key isn't included by requests.>>> req = requests.Request('POST', 'http://google.com', data=dict(a=None, b=1)) >>> req.prepare().body 'b=1'
Why is this the case? I was expecting an empty string, or something like
json.dumps(d)
whereNone
is rendered asnull
. I'm sure there's a good reason -- just curious about what it is. (One thing I can think of is that maybe there just isn't an encoding ofnull
orNone
available to the POST request -- is that true?)Additionally curious -- why does
requests
silently ignore such data instead of throwing an error?