Flutter - 在得到预期的 200 之前总是得到错误的 POST 400 响应

Posted

技术标签:

【中文标题】Flutter - 在得到预期的 200 之前总是得到错误的 POST 400 响应【英文标题】:Flutter - Always getting wrong POST 400 response before getting the expected 200 【发布时间】:2020-02-24 11:12:22 【问题描述】:

我在尝试在 Flutter 中获得对 POST 请求的正确响应时遇到了一些麻烦。这是我写的方法:

  Future<void> processUnload(String code) async 
    Map info = 
      'code': "$code",
    ;

    try 
      var response = await http.post(
        url + "/unload/code",
        body: json.encode(info), headers: 
          "Content-Type": "application/json",
          "Authorization": "Bearer $token"
        
      );

      if (response.statusCode == 200) 
        showUnloadOKMessage();
       else 
        showUnloadNotOKMessage(response.body);
      

    catch (error) 

      if (error.toString().contains("Failed host lookup")) 
        notDelivered.add(OfflineCart(code, DateTime.now().toString()));
        showOfflineUnloadMessage();
      

        
  

  showUnloadOKMessage()     
    return showDialog<void>(
      context: context,
      barrierDismissible: false,
      builder: (BuildContext context) 
        return AlertDialog(
          title:
              Text('Unload OK.', style: TextStyle(color: Colors.green)),
          actions: <Widget>[
            FlatButton(
              child: Text('OK', style: botonGrandeRojo),
              onPressed: () 
                Navigator.of(context).pop();
                FocusScope.of(contextobuild).requestFocus(focusNode);
              ,
            ),
          ],
        );
      ,
    );
  

  showUnloadNotOKMessage(String msg) 
    return showDialog<void>(
      context: context,
      barrierDismissible: false,
      builder: (BuildContext context) 
        return AlertDialog(
          title: Text(msg, style: TextStyle(color: Colors.red)),
          actions: <Widget>[
            FlatButton(
              child: Text('OK', style: botonGrandeRojo),
              onPressed: () 
                Navigator.of(context).pop();
                FocusScope.of(contextobuild).requestFocus(focusNode);
              ,
            ),
          ],
        );
      ,
    );
    

问题是,当发出 POST 请求时,我总是在得到实际和预期的 response.statusCode == 200 之前得到 4 或 5 个 response.statusCode == 400。因此,应用程序总是显示 4 或 5" Not OK 消息”,然后显示预期的“Unload OK”消息。

我已经阅读了很多 async/await/then 文章(Threading in Flutter、Using Futures Guide for Beginners、Flutter Async Loader),我很确定问题出在我编写代码的方式上,但我无法让它正常工作,因为我没有任何使用异步调用的经验。

谢谢。

【问题讨论】:

您发布的网址是什么?与curl 的行为相同吗? 【参考方案1】:

我发现了错误。问题是在 setState() 中多次调用 processUnload 方法。所以,我只需要添加一个标志来防止它同时被多次调用并删除 setState():

  Widget createCodeText() 
    bool processing = false;

    return Expanded(
      child: TextField(
        autofocus: true,
        decoration: InputDecoration(hintText: 'Esperando lectura...'),
        showCursor: false,
        controller: controllerCode,
        focusNode: focusNode,

        onChanged: (code) async 
          if (!processing)
            processing = true;
            await processUnload (code);
            processing = false;
            controllerCode.clear();
          
        ,

      ),
    );
  

【讨论】:

以上是关于Flutter - 在得到预期的 200 之前总是得到错误的 POST 400 响应的主要内容,如果未能解决你的问题,请参考以下文章

“(200-299)中的预期状态代码,得到 404”

Flutter 'showDatePicker' 抛出异常:错误:预期值为 'String' 类型,但得到类型为 'Null' 的值之一

NSLocalizedDescription=(200-299) 中的预期状态码,得到 400

AFNetworking 错误:“(200-299)中的预期状态代码,得到 404”

NSLocalizedDescription=(200-299)中的预期状态码,得到 422

RestKit .20 RKRequestDescriptor postObject - (400-499) 中的预期状态代码,得到 200