You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

REST API多服务器请求超时处理:Flutter代码优化需求

实现带超时的多API服务器轮询逻辑

问题分析

原代码仅在服务器返回非200状态码时切换服务器,但当服务器离线/无响应时,请求会无限等待。需要给每个请求添加2秒超时,超时后自动切换至下一台服务器。

优化后的代码

import 'dart:async';
import 'package:http/http.dart' as http;

Future<String> verifyAllProd() async {
  final authToken = Configuracoes.auth;
  // 按优先级排列的服务器地址列表
  final serverList = [
    'http://adsa.er.net:81/APP1/APPProducts',
    'http://adsa.er.net:82/APP1/APPProducts',
    'http://adsa.er.net:83/APP1/APPProducts',
  ];

  for (final serverUrl in serverList) {
    try {
      final uri = Uri.parse(serverUrl);
      // 发起请求并设置2秒超时
      final response = await http.get(
        uri,
        headers: {http.HttpHeaders.authorizationHeader: authToken},
      ).timeout(const Duration(seconds: 2));

      // 状态码200则返回响应体,结束流程
      if (response.statusCode == 200) {
        return response.body;
      }
      // 非200状态码,自动尝试下一台服务器
    } on TimeoutException {
      // 请求超时,继续尝试下一台
    } on Exception {
      // 其他请求异常(如连接失败、DNS解析失败等),继续尝试下一台
    }
  }

  // 所有服务器都尝试失败,抛出异常
  throw Exception('所有API服务器均无法正常响应');
}

关键改进说明

  • 服务器地址列表化:将三台服务器地址统一存入数组,后续调整优先级或新增服务器只需修改列表,无需重复编写请求逻辑
  • 超时控制:通过timeout方法为每个请求设置2秒超时时间,超时后会触发TimeoutException,捕获后直接切换到下一台服务器
  • 异常兜底:统一捕获请求过程中可能出现的各类异常(连接失败、DNS错误等),确保轮询流程不会因单个异常中断
  • 逻辑简化:用循环替代重复的条件判断,代码结构更清晰,可读性和可维护性更强

内容的提问来源于stack exchange,提问作者Rafael Reis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:50:26