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
相关产品推荐
相关产品推荐

