REST mail using Python-Request

Why is this simple POST code data not passed to my service:

import requests import json data = {"data" : "24.3"} data_json = json.dumps(data) response = requests.post(url, data=data_json) print response.text 

And my service is developed using WCF as follows:

  [OperationContract] [WebInvoke(Method = "POST", UriTemplate = "/test", ResponseFormat = WebMessageFormat.Json,RequestFormat=WebMessageFormat.Json)] string test(string data ); 

Note. If the input parameter data is deleted, everything works fine, which may be a problem.

+4
source share
1 answer

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) 
+11
source

All Articles