将 JSON 发送到 Flask,request.args 与 request.form

问题描述 投票:0回答:4

我的理解是,Flask 中的

request.args
包含来自
GET
请求的 URL 编码参数,而
request.form
包含
POST
数据。我很难理解为什么当发送
POST
请求时,尝试使用
request.form
访问数据会返回
400
错误,但是当我尝试使用
request.args
访问它时,它似乎工作正常.

我尝试使用

Postman
curl
发送请求,结果是相同的。

curl -X POST -d {"name":"Joe"} http://127.0.0.1:8080/testpoint --header "Content-Type:application/json"

代码:

@app.route('/testpoint', methods = ['POST'])
def testpoint():
    name = request.args.get('name', '')
    return jsonify(name = name)
python json rest flask post
4个回答
67
投票

您正在 POST-ing JSON,

request.args
request.form
都不起作用。

request.form
仅当您使用正确的内容类型发布数据时才有效; 表单数据使用 application/x-www-form-urlencoded
multipart/form-data
 编码进行 POST。

当您使用

application/json

时,您不再发布表单数据。使用 
request.get_json()
 来访问 JSON POST 数据:

@app.route('/testpoint', methods = ['POST']) def testpoint(): name = request.get_json().get('name', '') return jsonify(name = name)
正如您所说,

request.args

仅包含请求查询字符串中包含的值,这是
?
问号之后的URL的可选部分。由于它是 URL 的一部分,因此独立于 POST 请求正文。


3
投票
你的curl中的json数据是错误的,所以Flask不会解析数据形成。

像这样发送数据:

'{"name":"Joe"}'



curl -X POST -d '{"name":"Joe"}' http://example.com:8080/testpoint --header "Content-Type:application/json"
    

1
投票
只需更改表单的参数即可工作

@app.route('/testpoint', methods = ['POST']) def testpoint(): name = request.form.get('name', '')`enter code here` return jsonify(name = name)
    

0
投票
如果请求来自浏览器/表单或curl/postman,我希望我的api能够响应! 我怎样才能做到这一点!!

© www.soinside.com 2019 - 2024. All rights reserved.