在 FLUTTER 中提出 post 申请时,我没有收到 API 的回复

I'm not receiving response from API when making a post requisition in FLUTTER

我在向 API 发送数据时遇到了一个奇怪的错误。

我有一些端点在发送和接收数据时工作得很好。但是其中一个给我带来了一些麻烦。

我会尽力解释。

因此,当我使用 HTTP 包通过 POST 方法发送数据对象时,发送的数据到达数据库并被添加,但没有任何数据从申请返回。

Future postCupomFiscal(CupomFiscal cupom) async {
    log(jsonEncode(cupom.toJson()));

    var config = await LojaConfigs.iniciarConfigs();
    var url = Uri.parse('http://127.0.0.1:8082/api/v1/carga_venda');


    var client = http.Client();

    try {
      var response = await client
          .post(url,
              headers: {
                'Content-Type': 'application/json; charset=UTF-8',
                'ambiente': '${config['ambiente']}',
                'cnpj_loja': '${config['cnpj_loja']}',
                'chave_acesso': '${config['chaveacesso']}',
                'token': '${config['token']}'
              },
              body: jsonEncode(cupom.toJson()))
          .timeout(const Duration(seconds: 15));

      if (response.statusCode == 200 || response.statusCode == 201) {
        return jsonDecode(response.body);
      }
    } on SocketException {
      throw FetchDataException('Sem conexão com a Internet.');
    } on TimeoutException {
      throw FetchDataException('Tempo excedido.');
    } finally {
      client.close();
    }
    }
  }

预计响应 returns json 通知数据是否已插入数据库。

欢迎使用 Whosebug。

首先你得到的错误是 error: TimeoutException after 0:00:15.000000: Future not completed. 因为你说 POST 请求有时随机工作,有时不是我怀疑在某些情况下后端只是需要更多时间来给你一个答案。

要解决此问题,您可以删除 .timeout(const Duration(seconds: 15)); 行。

如果这不能解决问题,我会这样做:

  1. 尝试使用 Postman 重现该问题。如果可以,那问题肯定与你的Flutter代码无关。
  2. 尝试在 Postman 请求中 add/leave 输出一些 headers。有时 headers 会导致一些...奇怪的行为。

到目前为止,我觉得你的 Flutter 代码还不错。如果您知道后端不是罪魁祸首,请更新我们。

在您的场景中,这可能是应用无法随机接收响应的情况。最好的办法就是处理好再找到解决办法。

你的后端需要添加一个服务于 retries 的条件,这是由 flutter package http_retry.

发起的

当请求失败时,http_retry在第一次重试之前等待 500 毫秒,并且每次将延迟增加 1.5 倍。

将这个包安装到项目中:

flutter pub add http_retry

http_retry的解决方案:

Future<void> httpRetries() async {
  final client = RetryClient(
    http.Client(),
    retries: 4,
    // change the statusCode with one that can fit your case. When return true, this client will retry once the request
    when: (response) =>
        response.statusCode != 200 && response.statusCode != 201,
    // whenever an error is caught, this client will retry once the request when this function returns true
    whenError: (_, stackTrace) {
      print(stackTrace);
      return true;
    },
    onRetry: (_, __, ___) => print("retry!"),
  );
  try {
    // use this as usual as a http client
    print(await client.post(Uri.parse('https://your-post-url')));
  } finally {
    client.close();
  }
}

我真的很高兴你花时间和我一起寻找解决我问题的方法。 我和我团队的后端开发人员谈过,我们发现了问题。

当数据进入 API 时,进程设置了更新,此进程花费的时间比我们预期的要长。因此,虽然更新未完成,但 API 会一直冻结,等待更新结论和响应返回。

有时更新需要 10 秒,有的超过 2 分钟。

我们正在寻找解决此更新问题的方法。

非常感谢您的宝贵时间。