我正在尝试做一个侦听器,以查看我通过ifttt发布的内容,但是我收到了错误的请求(400)错误。这是代码:
from flask import Flask, abort, request
import json
app = Flask(__name__)
@app.route('/foo', methods=['POST'])
def foo():
if not request.json:
abort(400)
print(request.json)
return json.dumps(request.json)
if __name__ == '__main__':
app.run(host='192.168.1.10', port=27015, debug=True)
我在做什么错了?
答案 0 :(得分:0)
这听起来像是客户端的问题。
发布数据的客户端需要设置以下标头:
'Content-Type': 'application/json'
否则,request.json
返回None
,这在您的代码中将触发abort(400)
。
如果您无法在客户端上进行所需的更改,则可以使用request
的{{3}}方法,并传递force=True
。如果解析实际的有效负载失败,它将引发BadRequest
异常。
一种更好的写法是:
from flask import jsonify, abort
@app.route('/foo', methods=['POST'])
def foo():
try:
output = request.get_json(force=True)
except:
abort(400)
# output is now a dict of the incoming json payload
print(output)
return jsonify(output)
然后使用有效负载(但未设置内容类型标头)进行测试:
$ curl http://localhost:5000/foo -X POST -d '{"one":"two"}'
{
"one": "two"
}
无效的有效载荷:
$ curl http://localhost:5000/foo -X POST -d '{"one":"two3}'
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>400 Bad Request</title>
在输出数据上使用flask的jsonify()
函数,可以在出站时自动设置正确的内容类型。
编辑,如果您不确定哪些数据正在到达端点,并且只能在控制台中看到400响应,则可以尝试将该功能恢复为基本功能:
@app.route('/foo', methods=['POST'])
def foo():
print(request.get_json(force=True))
return 'works'
此处可能需要进行一些试验/错误测试。尝试通过您的ifttt
系统以及上面的curl命令提交。