You need to set the content type header:
data = {"data" : "24.3"} data_json = json.dumps(data) headers = {'Content-type': 'application/json'} response = requests.post(url, data=data_json, headers=headers)
If I set the url to http://httpbin.org/post , this server will repeat to me what was posted:
>>> import json >>> import requests >>> import pprint >>> url = 'http://httpbin.org/post' >>> data = {"data" : "24.3"} >>> data_json = json.dumps(data) >>> headers = {'Content-type': 'application/json'} >>> response = requests.post(url, data=data_json, headers=headers) >>> pprint.pprint(response.json()) {u'args': {}, u'data': u'{"data": "24.3"}', u'files': {}, u'form': {}, u'headers': {u'Accept': u'*/*', u'Accept-Encoding': u'gzip, deflate, compress', u'Connection': u'keep-alive', u'Content-Length': u'16', u'Content-Type': u'application/json', u'Host': u'httpbin.org', u'User-Agent': u'python-requests/1.0.3 CPython/2.6.8 Darwin/11.4.2'}, u'json': {u'data': u'24.3'}, u'origin': u'109.247.40.35', u'url': u'http://httpbin.org/post'} >>> pprint.pprint(response.json()['json']) {u'data': u'24.3'}
If you use requests version 2.4.2 or later, you can leave the JSON encoding in the library; it will automatically set the correct Content-Type header for you. Pass the data sent as JSON to the json keyword argument:
data = {"data" : "24.3"} response = requests.post(url, json=data)
source share