Flutter中Chopper+swagger_dart_code_generator API请求无限循环无响应问题
问题
我正在为NestJS服务器搭建Flutter客户端:通过nestJS/swagger生成Swagger文档,再用swagger_dart_code_generator生成客户端API代码。服务器经Postman测试运行正常,所有请求都能按预期执行。
但客户端存在异常:调用任意生成的API函数时,请求能正常发送到服务器,服务器处理后也会返回响应,可客户端无法接收该响应,反而会无限重复发送请求,原调用函数一直处于等待状态。该问题在Windows、Web、Android平台均能复现,且无任何错误或异常提示。请问是否遗漏了某些配置?还有哪些因素可能触发该行为?
相关代码
build.yaml
targets: $default: sources: - "lib/**" - "lib/swagger/**" builders: chopper_generator: options: header: "//Generated code" swagger_dart_code_generator: options: input_folder: "lib/swagger/" output_folder: "lib/swagger/models/" ignore_headers: true separate_models: true
services.dart
import 'dart:async'; import 'package:get_it/get_it.dart'; import 'package:my_client/core/services/my_authenticator.dart'; import 'package:my_client/swagger/models/client_index.dart'; final getIt = GetIt.instance; Future<void> setupServices() async { getIt.registerSingleton<MyApi>(MyApi.create( baseUrl: Uri.parse("http://localhost:3000"), authenticator: getIt<MyAuthenticator>(), )); }
my_authenticator.dart
import 'dart:async'; import 'dart:io'; import 'package:chopper/chopper.dart'; class MyAuthenticator extends Authenticator{ String token = ""; @override FutureOr<Request?> authenticate( Request request, Response response, [ Request? originalRequest, ]) async { if (response.statusCode == HttpStatus.unauthorized) { final String? newToken = await refreshToken(); if (newToken != null) { return request.copyWith(headers: { ...request.headers, HttpHeaders.authorizationHeader: newToken, }); } } return request; } Future<String?> refreshToken() async { return token; } }
user_provider.dart
import 'package:my_client/core/extensions/date_time_extension.dart'; import 'package:my_client/core/models/user_week.dart'; import 'package:my_client/swagger/models/my_api.swagger.dart'; class UserWeekProvider { final MyApi _api; UserWeekProvider(this._api); Future<UserWeek?> getWorkWeek(DateTime? date) async { final date = (date?? DateTime.now()).toIso8601String(); final response = await _api.userWeekGet( date: date ); if (response.body == null) return null; return UserWeek.fromResponse(response.body!); } }
问题分析与解决方案
1. Authenticator逻辑错误导致无限重试
这是最可能的原因:你的MyAuthenticator实现中,无论服务器返回什么状态码,最后都返回了原request。而Chopper的Authenticator机制是只要返回非null的Request,就会自动重新发送该请求。
即使服务器返回的是200成功响应,你的代码也会返回原请求,导致Chopper不断重复发送同一个请求,进入无限循环,原调用函数永远无法拿到响应。
修复方法:只有在处理401未授权且成功刷新token时才返回新请求,其他情况返回null,告诉Chopper终止重试:
@override FutureOr<Request?> authenticate( Request request, Response response, [ Request? originalRequest, ]) async { if (response.statusCode == HttpStatus.unauthorized) { final String? newToken = await refreshToken(); if (newToken != null) { return request.copyWith(headers: { ...request.headers, HttpHeaders.authorizationHeader: newToken, }); } } // 非401场景或刷新token失败时返回null,停止重试 return null; }
2. Swagger文档与客户端代码不兼容
- 检查Swagger文档中接口的响应格式,确保生成的Dart模型能正确解析服务器返回的JSON。如果响应解析失败,可能导致客户端无法识别响应,结合Authenticator的错误逻辑触发循环。
- 确认
swagger_dart_code_generator与chopper的版本兼容,版本不匹配可能生成有隐藏问题的代码。
3. 跨域配置问题(Web平台)
虽然Postman正常,但Web平台对CORS限制严格,检查NestJS服务器是否配置了正确的CORS策略,确保允许客户端域名的跨域请求,否则Web客户端可能无法读取响应内容。
4. 网络或拦截器干扰
- 检查是否有自定义的Chopper拦截器,是否拦截了响应导致客户端无法接收。
- 排查本地网络环境,比如代理工具(Charles、Fiddler)是否干扰了响应的正常返回。
内容的提问来源于stack exchange,提问作者Haissem55
相关产品推荐
相关产品推荐

