Метод POST в RESTful API работает на HTTPie, но не на Android / Почтальон - PullRequest
0 голосов
/ 12 мая 2019

Я написал метод POST в RESTful API Flask и успешно добавил данные на сервер, используя HTTPie, HTTP-клиент командной строки. Но когда я попробовал это на Android, произошла ошибка. Вот код клиента:

@app.route('/factories', methods=['POST'])
def create_factory():
    if not request.json or not 'fac_name' in request.json:
        abort(404)
    factory = {
        'id': factories[-1]['id'] + 1,
        'fac_name': request.json['fac_name'],
        'lat': request.json['lat'],
        'lng': request.json['lng']
    }

    factories.append(factory)
    return jsonify({'factory': factory}), 201

Результат HTTPie выглядит следующим образом: enter image description here

Ошибка Flask:

192.168.0.101 - - [13 / May / 2019 03:37:44] "POST / factory HTTP / 1.1" 500 - Traceback (последний вызов был последним):

Файл "C: \ Users \ Steve \ PycharmProjects \ test \ venv \ lib \ site-packages \ flask \ app.py", строка 2309, в вызов вернуть self.wsgi_app (environment, start_response)

Файл "C: \ Users \ Steve \ PycharmProjects \ test \ venv \ lib \ site-packages \ flask \ app.py", строка 2295, в wsgi_app response = self.handle_exception (e)

Файл "C: \ Users \ Steve \ PycharmProjects \ test \ venv \ lib \ site-packages \ flask \ app.py", строка 1741, в handle_exception ререйз (exc_type, exc_value, tb)

Файл "C: \ Users \ Steve \ PycharmProjects \ test \ venv \ lib \ site-packages \ flask_compat.py", строка 35, в ререйзе повысить значение

Файл "C: \ Users \ Steve \ PycharmProjects \ test \ venv \ lib \ site-packages \ flask \ app.py", строка 2292, в wsgi_app response = self.full_dispatch_request ()

Файл "C: \ Users \ Steve \ PycharmProjects \ test \ venv \ lib \ site-packages \ flask \ app.py", строка 1815, в full_dispatch_request rv = self.handle_user_exception (e)

Файл "C: \ Users \ Steve \ PycharmProjects \ test \ venv \ lib \ site-packages \ flask \ app.py", строка 1718, в handle_user_exception ререйз (exc_type, exc_value, tb)

Файл "C: \ Users \ Steve \ PycharmProjects \ test \ venv \ lib \ site-packages \ flask_compat.py", строка 35, в ререйзе повысить значение

Файл "C: \ Users \ Steve \ PycharmProjects \ test \ venv \ lib \ site-packages \ flask \ app.py", строка 1813, в full_dispatch_request rv = self.dispatch_request ()

Файл "C: \ Users \ Steve \ PycharmProjects \ test \ venv \ lib \ site-packages \ flask \ app.py", строка 1799, в dispatch_request вернуть self.view_functionsrule.endpoint

Файл "C: \ Users \ Steve \ PycharmProjects \ test \ venv \ hello.py", строка 124, в create_factory

'fac_name': request.json['fac_name'],

TypeError: объект 'NoneType' не может быть подписан

UPDATE: Я изменил строку if not на if not request.json: abort(401), и теперь это ошибка 401. И я также пытался использовать Postman, и это был тот же тип ошибки, поэтому я думаю, что это не имеет ничего общего с кодами Android, и я удалил код Android отсюда.

Вот результат Почтальона: enter image description here

Ответы [ 3 ]

0 голосов
/ 13 мая 2019

Ошибка полезна.

File "C:\Users\Steve\PycharmProjects\test\venv\hello.py", line 124, in create_factory

'fac_name': request.json['fac_name'],

TypeError: 'NoneType' object is not subscriptable

объект не может быть подписан

Это означает, что вы пытаетесь ['keyword'] для объекта, который его не поддерживает,а именно NoneType.

, из которого вы можете вывести request.json, это NoneType

0 голосов
/ 13 мая 2019

вместо

if not request.json or not 'fac_name' in request.json:
        abort(404)
    factory = {
        'id': factories[-1]['id'] + 1,
        'fac_name': request.json['fac_name'],
        'lat': request.json['lat'],
        'lng': request.json['lng']
    }

Я использовал

    data=request.data
    j_data = json.loads(data)

    factory = {
        'id': factories[-1]['id'] + 1,
        'fac_name': j_data['fac_name'],
        'lat': j_data['lat'],
        'lng': j_data['lng']
    }

И это работает. Однако я понятия не имею, почему.

0 голосов
/ 13 мая 2019

Вы ожидаете JSON-запрос

if not request.json or not 'fac_name' in request.json:

Но вы отправляете данные формы.

Пожалуйста, отметьте переключатель «raw» и установите тип содержимого «application /»json "postman

Затем необходимо добавить действительный json в тело вашего запроса.

...