Попытка интегрировать google assistant в python через ifttt для изучения и тестирования некоторых вещей - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь сделать слушателя, чтобы посмотреть, что я публикую через 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 голосов
/ 27 января 2019

Это звучит как проблема на стороне клиента.

Клиент, который отправляет данные, должен установить следующий заголовок:

'Content-Type': 'application/json'

В противном случае request.json возвращает None, что в вашем коде вызовет abort(400).

Если вы не можете внести необходимые изменения на клиенте, вы можете использовать get_json () метод request и передать 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>

? Использование функции колбы jsonify() для исходящих данных автоматически устанавливает правильные типы содержимого при выходе.


Редактировать , если вы не уверены, какие данные достигают конечной точки и видите только 400 откликов в консоли, то, возможно, попробуйте привести функцию обратно к основам:

@app.route('/foo', methods=['POST']) 
def foo():
    print(request.get_json(force=True))
    return 'works'

Возможно, здесь требуется некоторое тестирование на наличие проб / ошибок. Попытайтесь отправить через систему ifttt, а также приведенные выше команды curl.

...