Flutter网络请求拦截插件lehttp_overrides的使用

发布于 1周前 作者 nodeper 来自 Flutter

Flutter网络请求拦截插件lehttp_overrides的使用

简介

lehttp_overrides 是一个Flutter插件,用于解决Android 7.1.1及以下版本中与Let’s Encrypt SSL证书相关的问题。更多详情可以参见这里(意大利语)

快速开始

为了启用修复功能,你需要在项目的入口处添加如下代码:

import 'package:lehttp_overrides/lehttp_overrides.dart';
import 'package:flutter/material.dart';
import 'dart:io';

void main() {
  // 判断当前平台是否为Android
  if (Platform.isAndroid) {
    HttpOverrides.global = LEHttpOverrides();
  }
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

这段代码展示了如何在应用程序启动时检查当前平台是否为Android,如果是,则设置HttpOverrides.globalLEHttpOverrides(),以应用SSL证书修复。

关键点解释

  1. ISRG Root X1证书路径:此修复依赖于使用ISRG Root X1证书路径,并通过将ISRG Root X1 CA添加到证书存储中来工作。对于Android > 7.1.1的系统来说,这是无害的,因为系统本身已经包含了这个证书。
  2. allowExpiredDSTX3参数LEHttpOverrides构造函数有一个可选参数allowExpiredDSTX3(默认值为false),它允许接受已过期的DST Root CA X3证书。对于使用OpenSSL >= 1.1的环境,通常不会触发这个检查,但对于旧版Android系统仍然需要它。建议保持此选项关闭,并使用ISRG Root X1证书路径。

总结

通过上述配置,你可以有效地解决Flutter项目中Android 7.1.1及以下版本遇到的Let’s Encrypt SSL证书问题。确保根据实际情况调整配置,并尽可能使用最新的证书路径以获得最佳的安全性和兼容性。


更多关于Flutter网络请求拦截插件lehttp_overrides的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络请求拦截插件lehttp_overrides的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用lehttp_overrides插件来进行网络请求拦截的示例代码。lehttp_overrides允许你拦截和修改发出的HTTP请求,以及处理接收到的HTTP响应。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加lehttp_overrides依赖:

dependencies:
  flutter:
    sdk: flutter
  lehttp_overrides: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 配置拦截器

接下来,在你的应用程序中配置HTTP拦截器。通常,你可以在main.dart文件中进行设置。

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:lehttp_overrides/lehttp_overrides.dart';

void main() {
  // 配置全局拦截器
  LeHttpOverrides.global = MyHttpOverrides();

  runApp(MyApp());
}

class MyHttpOverrides extends LeHttpOverrides {
  @override
  http.Client createHttpClient(SecurityContext? context) {
    return InterceptingClient.build(
      client: http.Client(),
      interceptors: [
        LoggingInterceptor(), // 打印请求和响应日志
        MyCustomInterceptor(), // 自定义拦截器
      ],
    );
  }
}

class LoggingInterceptor extends HttpRequestInterceptor with HttpResponseInterceptor {
  @override
  void onRequest(HttpRequest request) {
    print('Sending request: ${request.method} ${request.url}');
    request.headers.forEach((name, values) {
      values.forEach((value) {
        print('$name: $value');
      });
    });
    if (request.body != null) {
      print('Request body: ${request.body}');
    }
  }

  @override
  void onResponse(HttpResponse response) {
    print('Received response: ${response.statusCode} ${response.request?.url}');
    response.headers.forEach((name, values) {
      values.forEach((value) {
        print('$name: $value');
      });
    });
    if (response.bodyBytes != null) {
      print('Response body: ${String.fromCharCodes(response.bodyBytes!)}');
    }
  }
}

class MyCustomInterceptor extends HttpRequestInterceptor {
  @override
  void onRequest(HttpRequest request) {
    // 在这里你可以修改请求,例如添加自定义头信息
    request.headers.add('x-custom-header', 'value');
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Network Interception Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/todos/1'));
              print('Final response: ${response.body}');
            },
            child: Text('Fetch Data'),
          ),
        ),
      ),
    );
  }
}

3. 解释代码

  • 配置全局拦截器:在main函数中,我们通过LeHttpOverrides.global设置全局HTTP拦截器。
  • 创建拦截器MyHttpOverrides类继承自LeHttpOverrides,并重写了createHttpClient方法,返回一个InterceptingClient实例,该实例包含多个拦截器。
  • 日志拦截器LoggingInterceptor类同时实现了HttpRequestInterceptorHttpResponseInterceptor接口,用于打印请求和响应的详细信息。
  • 自定义拦截器MyCustomInterceptor类只实现了HttpRequestInterceptor接口,用于在请求发送前添加自定义头信息。
  • 使用HTTP客户端:在MyApp类中,我们直接使用http.get方法发起网络请求,此时请求和响应都会经过我们配置的拦截器。

通过上述代码,你可以在Flutter应用中轻松实现网络请求的拦截和处理。根据需要,你可以扩展或修改拦截器的逻辑以满足特定需求。

回到顶部