【问题标题】:POST method in RESTful API works on HTTPie but not on Android/PostmanRESTful API 中的 POST 方法适用于 HTTPie,但不适用于 Android/Postman
【发布时间】:2019-05-13 15:47:37
【问题描述】:

我在 Flask 的 RESTful API 中编写了 POST 方法,并使用命令行 HTTP 客户端 HTTPie 成功地将数据添加到服务器。但是,当我在 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 结果是这样的:

Flask的错误:

192.168.0.101 - - [13/May/2019 03:37:44] “POST /factories HTTP/1.1”500 - Traceback(最近一次调用最后一次):

调用中的文件“C:\Users\Steve\PycharmProjects\test\venv\lib\site-packages\flask\app.py”,第 2309 行 return self.wsgi_app(environ, 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 中 reraise(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 响应 = 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 reraise(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' 对象不可下标

更新: 我将if not 行更改为if not request.json: abort(401),现在是401 错误。而且我也试过用Postman,也是同样类型的错误,所以我认为这与Android代码无关,我从这里删除了Android代码。

这是 Postman 的结果:

【问题讨论】:

  • 使用request.get_json 而不是request.json
  • 鉴于前面的if not request.json,我看不出这个错误是怎么可能的。
  • 我把if not改成if not request.json: abort(401),现在是401错误。

标签: python flask postman flask-restful


【解决方案1】:

您正在等待 JSON 请求

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

但是您正在发送表单数据。

请检查单选按钮“原始”并将内容类型设置为“应用程序/json”

然后你必须在你的请求正文中添加一个有效的 json。

【讨论】:

  • 内容类型正确,请求正文为{ "fac_name": "test", "lat":30, "lng":110 }。还是不行。
  • 也许对你没有帮助,但对我有帮助。我正在发送 fom-data。
【解决方案2】:

这个错误很有帮助。

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.jsonNoneType

【讨论】:

    【解决方案3】:

    而不是

    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']
        }
    

    而且它有效。但是我不知道为什么。

    【讨论】:

      猜你喜欢
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2017-08-06
      • 1970-01-01
      • 2021-04-27
      • 2020-06-17
      • 1970-01-01
      相关资源
      最近更新 更多