尝试通过ifttt将Google Assistant集成到python中以学习和测试一些东西

时间:2019-01-27 01:09:17

标签: python python-3.x webhooks

我正在尝试做一个侦听器,以查看我通过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)

我在做什么错了?

1 个答案:

答案 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命令提交。