Got Failed to decode JSON object when calling a POST request in flask python
Solution 1
This works in Windows 7 64:
curl -i -H "Content-Type: application/json" -X POST -d "{\"title\":\"Read a book\"}" http://localhost:5000/todo/api/v1.0/tasks
Back slashes and double quotes.
Solution 2
If you are using windows your json string in your request should look like:
"{\"title\":\"Read a boo\"}"
I've got the same problem and it helped.
Solution 3
I Managed to get it working using Anaconda cmd window, python3, using backslashes and double quotes around the whole expression! Works:
curl "localhost:5000/txion" -H "Content-Type: application/json" -d "{\"from\": \"akjflw\" ,\"to\" : \"fjlakdj\", \"amount\": 4}"
Does not work:
curl "localhost:5000/txion" -H "Content-Type: application/json" -d '{\"from\": \"akjflw\" ,\"`to\" : \"fjlakdj\", \"amount\": 4}'
Solution 4
Instead of using the request.json
property, try using request.get_json(force=True)
I would rewrite it:
@app.route('/todo/api/v1.0/tasks', methods=['POST'])
def create_task():
try:
blob = request.get_json(force=True)
except:
abort(400)
if not 'title' in blob:
abort(400)
task = {
'id': tasks[-1]['id'] + 1,
'title': blob['title'],
'description': blob.get('description', ""),
'done': False
}
tasks.append(task)
return jsonify({'task': task})
Zeinab Abbasimazar
Looking to attain a challenging and responsible position as a software engineer and software analyst in telecommunication and software industry which effectively utilizes my personal, professional and educational skills and experiences. I’m also looking forward to learn and experience more on big data concepts/solutions.
Updated on July 05, 2022Comments
-
Zeinab Abbasimazar almost 2 years
I have written a simple REST-ful web server in python with
flask
following steps in this tutorial; but I've got a problem callingPOST
request. The code is:@app.route('/todo/api/v1.0/tasks', methods=['POST']) def create_task(): if not request.json or not 'title' in request.json: abort(400) task = { 'id': tasks[-1]['id'] + 1, 'title': request.json['title'], 'description': request.json.get('description', ""), 'done': False } tasks.append(task) return jsonify({'task': task}), 201
I send a
POST
request usingcurl
as the example in the above mentioned page:curl -i -H "Content-Type: application/json" -X POST -d '{"title":"Read a book"}' http://127.0.0.1:5000/todo/api/v1.0/tasks
But I get this error in response:
HTTP/1.0 400 BAD REQUEST Content-Type: text/html Content-Length: 187 Server: Werkzeug/0.11.10 Python/2.7.9 Date: Mon, 30 May 2016 09:05:52 GMT <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <title>400 Bad Request</title> <h1>Bad Request</h1> <p>Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)</p>
I've tried to debug and I found out in the
get_json
method, the passed argument has been translated to'\\'{title:Read a book}\\''
asdata
andrequest_charset
isNone
; but I have no idea for a solution. Any help?EDIT 1:
I have tried @domoarrigato's answer and implemented the
create_task
method as the following:@app.route('/todo/api/v1.0/tasks', methods=['POST']) def create_task(): try: blob = request.get_json(force=True) except: abort(400) if not 'title' in blob: abort(400) task = { 'id': tasks[-1]['id'] + 1, 'title': blob['title'], 'description': blob.get('description', ""), 'done': False } tasks.append(task) return jsonify({'task': task}), 201
But this time I got the following error after calling
POST
viacurl
:HTTP/1.0 400 BAD REQUEST Content-Type: text/html Content-Length: 192 Server: Werkzeug/0.11.10 Python/2.7.9 Date: Mon, 30 May 2016 10:56:47 GMT <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <title>400 Bad Request</title> <h1>Bad Request</h1> <p>The browser (or proxy) sent a request that this server could not understand.</p>
EDIT 2:
To clarify, I should mention that I'm working on a 64-bit version of Microsoft Windows 7 with Python version 2.7 and the latest version of Flask.
-
domoarigato almost 8 yearsupdated my answer - removed the
, 201
in the return statement - i think you just need to return the serialized json. -
Zeinab Abbasimazar almost 8 yearsYour solution is totally identical to mine!
-
Amitkumar Karnik almost 8 yearsyea that's what! I was not able to reproduce the error!!
-
Mohamed ALOUANE almost 7 yearsThis is not a valid answer !
-
Bimlesh Sharma over 5 years@Amit Karnik This error comes when u run in windows because is is not able to understand that for what purpose that meta char ` " ` it has to use. So use ` \" ` instead of ` " ` will work perfectly.
-
Amitkumar Karnik over 5 yearseveryone knows it... have anything diff??
-
Kevin Amorim about 5 yearsWorked for me! Using Windows 10 x64. Thank you!
-
Kavin Raju S about 4 yearsThank you @dmitriy-bogdanov This worked for me in Windows 10 - 64bit version...
-
Kelly Bang almost 4 yearsUsing powershell you will need to use ` to escape the double quote