在flask python中调用POST请求时,无法解码JSON对象

Zei*_*zar 9 python webserver json flask flask-restful

我在python中编写了一个简单的REST-ful Web服务器flask,本教程中包含以下步骤; 但是我在调​​用POST请求时遇到了问题.代码是:

@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
Run Code Online (Sandbox Code Playgroud)

POST使用curl上述页面中的示例发送请求:

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
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个错误:

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>
Run Code Online (Sandbox Code Playgroud)

我试过调试,我发现在get_json方法中,传递的参数已被翻译为'\\'{title:Read a book}\\''as datarequest_charsetis None; 但我不知道解决方案.有帮助吗?

编辑1:

我尝试了@ domoarrigato的答案并实现create_task了以下方法:

@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
Run Code Online (Sandbox Code Playgroud)

但是这次我在调用POSTvia 之后遇到以下错误curl:

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>
Run Code Online (Sandbox Code Playgroud)

编辑2:

为了澄清,我应该提到我正在开发64位版本的Microsoft Windows 7,其中包含Python 2.7和最新版本的Flask.

小智 18

这适用于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
Run Code Online (Sandbox Code Playgroud)

反斜线和双引号.


dom*_*ato 1

不要使用该request.json属性,而是尝试使用request.get_json(force=True) 我会重写它:

@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})
Run Code Online (Sandbox Code Playgroud)