RESTful API中的POST方法适用于HTTPie,但不适用于Android / Postman

时间:2019-05-12 19:48:29

标签: python flask postman flask-restful

我在Flask的RESTful API中编写了POST方法,并使用命令行HTTP 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结果如下: enter image description here

烧瓶的错误:

192.168.0.101--[13 / May / 2019 03:37:44]“ POST / factories HTTP / 1.1” 500- 追溯(最近一次通话):

调用中的文件“ C:\ Users \ Steve \ PycharmProjects \ test \ venv \ lib \ site-packages \ flask \ app.py”,第2309行     返回self.wsgi_app(环境,start_response)

wsgi_app中的文件“ C:\ Users \ Steve \ PycharmProjects \ test \ venv \ lib \ site-packages \ flask \ app.py”,第2295行     响应= 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行,重新发行     提高价值

wsgi_app中的文件“ C:\ Users \ Steve \ PycharmProjects \ test \ venv \ lib \ site-packages \ flask \ app.py”,行2292     响应= 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)

handle_user_exception中的文件“ C:\ Users \ Steve \ PycharmProjects \ test \ venv \ lib \ site-packages \ flask \ app.py”,行1718     重新提高(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

create_factory中第124行的文件“ C:\ Users \ Steve \ PycharmProjects \ test \ venv \ hello.py”

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

TypeError:“ NoneType”对象不可下标

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

这是邮递员的结果: enter image description here

3 个答案:

答案 0 :(得分:0)

您希望收到JSON请求

SendSubscribeMail

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

请检查单选按钮“ raw”并将内容类型设置为“ application / json” postman

然后,您必须在请求正文中添加有效的json。

答案 1 :(得分:0)

该错误很有帮助。

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

答案 2 :(得分:0)

代替

  //DONE: static : we don't want "this" here
  public static void SetArrayElement(int row, int col)
  {
     //DONE: validate public method's values
     if (row < array.GetLowerBound(0) || row > array.GetUpperBound(0))
         throw new ArgumentOutOfRangeException(nameof(row));
     else if (col < array.GetLowerBound(1) || col > array.GetUpperBound(1))
         throw new ArgumentOutOfRangeException(nameof(col)); 

     array[row, col] = true; // true, instead of 1
  }

我用过

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

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