LINUX.ORG.RU

Flask. RestAPI. Ошибка получения параметров json

 , , ,


0

1

Доброго дня. Проект на flask(python 3.6.4). Сделано api. Делал по мануалам в интернете. Тестировал с помощью postman. Ситуация следующая.

В postman выполняю POST запрос на http://localhost:5000/api/v1/users для добавления пользователя. Сontent-type: application-json. В body raw пишу {«mail»:«test@mail.ru», «password»:«12345»}. Все отрабатывает. User добавляется.

Аналогично прекрасно отрабатывает это:

curl -H «Content-Type: application/json» -X POST -d '{«mail»:«test2@mail.ru»,«password»:«123456»}' http://localhost:5000/api/v1/users

Но, если начинаю тестить через RestletClient(Chrome), то ничего не работает. Т.е. я добавляю query parameters (mail и password), в headers указываю Content-Type : application-json. И получаю в ответ при POST-запросе:400 Bad Request. Failed to decode JSON object: Expecting value: line 1 column 1 (char 0).

При этом строка запроса выглядит так: http://localhost:5000/api/v1/users?mail=test@mail.ru&password=1234df Т.е. правильно, но совсем не так,как когда я использую body raw в postman (где все работает). Если content-type не указывать, то ошибка 500. И я так понимаю, что flask не может прочитать параметы в запросе и определяет их как None.

Вот код:

# CREATE_USER
@app.route('/api/v1/users', methods=['POST'])
def create_user():
    _mail = request.json.get("mail")
    _pass = request.json.get("password")
    if _mail is None or _pass is None:
        abort(404) # потеряны аргументы
    if User.query.filter_by(mail = _mail).first() is not None:
        abort(404) # пользователь существует
    new_user = User(mail = _mail)
    new_user.set_password(_pass)
    db.session.add(new_user)
    db.session.commit()
    userID = new_user.id
    data = User.query.filter_by(id=userID).first()
    result = [data.id, data.mail]
    return jsonify(result=result), 201

Что не так? Как правильно прочитать параметры mail и password из запроса? Спасибо!


При этом строка запроса выглядит так

так у тебя гет вместо поста, крути RestletClient

anonymous ()

RestletClient(Chrome) вижу рестклиент врет

ggrn ★★★★★ ()

При этом строка запроса выглядит так

У вас плагин не правильно формирует запрос. Но у меня это не воспроизводится, все отрабатывает как и ожидалось. Как поправить не подскажу, но копайте в сторону RestletClient'а.

micronekodesu ★★★ ()
Ответ на: комментарий от kerby

Кстати, «abort(404)» - не правильный код для ваших состояний, раз уж делаете так сразу делайте правильно, REST это в целом про то что надо использовать стандартные возможности протокола, так что отвечать 404 надо когда страницы нет, а для других случаев - другие коды.

micronekodesu ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.