flutter - 在 flutter 中收到完整 header 之前关闭连接

标签 flutter android-studio dio

我在尝试使用我的 API 时遇到问题,在跟进这个问题后我陷入了困境,我尝试了不同版本的不同模拟器,但问题仍然存在。

错误:

DioError [DioErrorType.other]: HttpException: Connection closed before full header was received, uri = http://10.0.2.2:7108/Users/authenticate

flutter 医生

enter image description here

HTTP 发布

class AuthenticateRemoteApi extends AuthenticateGateway {
  final AuthenticateMapper _authenticateMapper = AuthenticateMapper();

  @override
  Future<SesionUser> login(Authenticate user) async {
    var dio = Dio();
    dio.options.headers['content-Type'] = 'application/json';
    String url = 'http://10.0.2.2:7108/Users/authenticate';

    try {
      Response response = await dio.post(url, data: authenticateModelToJson(user));
      return _authenticateMapper.fromMap(jsonDecode(response.data));
    } catch (e) {
      throw Exception(e);
    }
  }
}

最佳答案

我通过创建这个拦截器来解决这个问题。

它的想法是当遇到这个随机错误时只是重试请求。

/// Interceptor
class RetryOnConnectionChangeInterceptor extends Interceptor {
  final Dio dio;

  RetryOnConnectionChangeInterceptor({
    required this.dio,
  });

  @override
  void onError(DioError err, ErrorInterceptorHandler handler) async {
  if (_shouldRetryOnHttpException(err)) {
      try {
        handler.resolve(await DioHttpRequestRetrier(dio: dio).requestRetry(err.requestOptions).catchError((e) {
          handler.next(err);
        }));
      } catch (e) {
        handler.next(err);
      }
    } else {
      handler.next(err);
    }

  }

  bool _shouldRetryOnHttpException(DioError err) {
    return err.type == DioErrorType.other &&
        ((err.error is HttpException && err.message.contains('Connection closed before full header was received')));
  }
}

/// Retrier
class DioHttpRequestRetrier {
  final Dio dio;

  DioHttpRequestRetrier({
    required this.dio,
  });

  Future<Response> requestRetry(RequestOptions requestOptions) async {
    return dio.request(
      requestOptions.path,
      cancelToken: requestOptions.cancelToken,
      data: requestOptions.data,
      onReceiveProgress: requestOptions.onReceiveProgress,
      onSendProgress: requestOptions.onSendProgress,
      queryParameters: requestOptions.queryParameters,
      options: Options(
        contentType: requestOptions.contentType,
        headers: requestOptions.headers,
        sendTimeout: requestOptions.sendTimeout,
        receiveTimeout: requestOptions.receiveTimeout,
        extra: requestOptions.extra,
        followRedirects: requestOptions.followRedirects,
        listFormat: requestOptions.listFormat,
        maxRedirects: requestOptions.maxRedirects,
        method: requestOptions.method,
        receiveDataWhenStatusError: requestOptions.receiveDataWhenStatusError,
        requestEncoder: requestOptions.requestEncoder,
        responseDecoder: requestOptions.responseDecoder,
        responseType: requestOptions.responseType,
        validateStatus: requestOptions.validateStatus,
      ),
    );
  }
}

用法:将此拦截器 [RetryOnConnectionChangeInterceptor] 添加到您的 Dio 客户端实例

关于flutter - 在 flutter 中收到完整 header 之前关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71343893/

相关文章:

dart - Flutter - 在应用交互中生成

android-studio - Mobicents Restcomm Hello World 实现

flutter - Flutter中dio的全局配置(拦截器)

android - 找不到资源样式/LaunchTheme

flutter - 使代码在小部件创建困惑时运行

android - 每当我尝试运行我的 Flutter 程序时,它都会卡在 “Running Gradle task ' assembleDebug”

flutter - Dio:如何添加多个拦截器?

android - 使用 Proguard 时未生成 mapping.txt 文件

Android Studio AAPT 错误 : libpng error: Not a PNG file

flutter - 如何使用 Flutter 发送多部分文件