通过Curl向Flask发送JSON请求

31

我在Flask中设置了一个非常简单的帖子路由,就像这样:

from flask import Flask, request

app = Flask(__name__)

@app.route('/post', methods=['POST'])
def post_route():
    if request.method == 'POST':

        data = request.get_json()

        print('Data Received: "{data}"'.format(data=data))
        return "Request Processed.\n"

app.run()

以下是我试图从命令行发送的curl请求:

curl localhost:5000/post -d '{"foo": "bar"}'

但是,它仍然会打印出“Data Received:“None””。因此,它无法识别我传递的JSON。

在这种情况下,是否需要指定JSON格式?

1个回答

31
根据get_json文档:

[...]如果 mimetype 不是 application/json,则该函数将返回None,但可以通过 force 参数覆盖此行为。

因此,要么指定传入请求的 mimetype 为 application/json:
curl localhost:5000/post -d '{"foo": "bar"}' -H 'Content-Type: application/json'

或者通过force=True强制进行JSON解码:

data = request.get_json(force=True)
如果在Windows上运行(使用cmd.exe,而不是PowerShell),您还需要更改JSON数据的引用方式,从单引号更改为双引号:
如果在Windows上运行(使用cmd.exe,而不是PowerShell),您还需要更改JSON数据的引用方式,从单引号更改为双引号:
curl localhost:5000/post -d "{\"foo\": \"bar\"}" -H 'Content-Type: application/json'

3
很不幸,仍然无法正常工作。 - OhMad
你看到问题的编辑了吗?我以为你打错了,但也可能是代码中的错误。检查一下你的打印语句是否使用了正确的格式:print('Data Received: "{data}"'.format(data=data)) - randomir
如果您想使用新的插值字符串,您错过了f前缀。 - randomir
你使用的是哪个版本的Flask/Curl?在什么平台上? - randomir
1
@user305883,request.form 包含表单的值。当你使用 JSON body 编码时,那不是表单。在这里可以了解有关表单的介绍:链接 - randomir
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接