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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:32:11