Flutter网络请求适配器插件dio_adapter的使用

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

Flutter网络请求适配器插件dio_adapter的使用

DioAdapterBase

DioBuilder 是一个 Dart 包装,它简化了使用 Dio 库进行 HTTP 请求。 它提供了一处理 API CRUD 操作的结构化方式,包括自定义请求和响应处理、错误管理以及 HTTP 客户端适应。

功能

  • CRUD 操作: 简单地执行 GET, POST, PUT 和 DELETE 请求。
  • 自定义请求和响应处理器: 自定义请求和响应处理器。
  • 错误处理: 综合错误处理来管理各种 Dio 异常。
  • HTTP 客户端适应: 为特定用例适应 HTTP 客户端,包括自签名证书。

开始使用

安装

dio_adapter 包添加到您的 pubspec.yaml 文件中:

dependencies:
  dio_adapter: ^2.1.2 # 这是最新版本

示例代码

// 示例使用 DioBuilderBase
import 'package:dio_adapter/dio_adapter.dart';

void main() async {
  final dioBuilder = DioAdapterBase(
    baseUrl: 'https://jsonplaceholder.typicode.com',
    connectTimeout: Duration(seconds: 1000),
    receiveTimeout: Duration(seconds: 1800),
    contentTypeEnum: ContentTypeEnum.applicationJson,
    responseTypeEnum: ResponseTypeEnum.json,
    sslCertificateSHa256:
        "drJ7gKWAJ9w88dpo2sFEO2TmX0LYDYD4vrb6FASSTtac=", // 这个值必须存储在安全的地方,如 .env 文件中,并不提交到源代码控制
    customRequestHandler: (options, handler) async {
      // 在发送请求之前做点什么。
      // 如果你想用自定义数据解决请求,你可以用 `handler.resolve(response)` 来解决
      //       if (options.path.contains("/mock-endpoint")) {
      //         // 创建一个模拟响应
      //         final mockResponse = Response(
      //           requestOptions: options,
      //           data: {"message": "This is a mock response"},
      //           statusCode: 200,
      //           statusMessage: "OK",
      //         );
      //         // 解决请求与模拟响应
      //         return handler.resolve(mockResponse);
      //       }
      // 如果你想用错误信息拒绝请求,你可以用 `handler.reject(dioError)` 来拒绝
      //  final token = options.headers["Authorization"];
      //       if (token == null || token.isEmpty) {
      //         return handler.reject(
      //           DioException(
      //             requestOptions: options,
      //             type: DioExceptionType.badResponse,
      //             error: "Unauthorized: Missing or invalid token",
      //           ),
      //         );
      //       }
      return options;
    },
    customResponseHandler: (response, handler) async {
      // 处理响应数据。
      // 如果你想用错误信息拒绝请求,你可以用 `handler.reject(dioError)` 来拒绝。
      return response;
    },
    customErrorHandler: (error, handler) async {
      // 处理响应错误。
      // 如果你想用自定义数据解决请求,你可以用 `handler.resolve(response)` 来解决。
      return error;
    },
  );

  // 示例 GET 请求
  final getResult = await dioBuilder.get('/posts/1');
  getResult.fold(
    (error) => print('GET Error: $error'),
    (response) => print('GET Response: ${response.data}'),
  );

  // 示例 POST 请求
  final postResult = await dioBuilder
      .post('/posts', body: {'title': 'foo', 'body': 'bar', 'userId': 1});
  postResult.fold(
    (error) => print('POST Error: $error'),
    (response) => print('POST Response: ${response.data}'),
  );

  // 示例 PUT 请求
  final putResult = await dioBuilder.put('/posts/1', body: {
    'id': 1,
    'title': 'updated title',
    'body': 'updated body',
    'userId': 1
  });
  putResult.fold(
    (error) => print('PUT Error: $error'),
    (response) => print('PUT Response: ${response.data}'),
  );

  // 示例 DELETE 请求
  final deleteResult = await dioBuilder.delete('/posts/1');
  deleteResult.fold(
    (error) => print('DELETE Error: $error'),
    (response) => print('DELETE Response: ${response.statusCode}'),
  );
}

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

1 回复

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


当然,下面是一个关于如何在Flutter中使用dio_adapter插件来进行网络请求适配器的示例代码。dio_adapter插件允许你拦截和修改请求/响应,非常适合用于日志记录、错误处理、添加认证头部等操作。

首先,确保你的pubspec.yaml文件中已经添加了diodio_http_adapter依赖:

dependencies:
  flutter:
    sdk: flutter
  dio: ^4.0.0
  dio_http_adapter: ^4.0.0

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

以下是一个完整的示例,展示如何使用diodio_http_adapter来进行网络请求,并添加请求和响应的拦截器:

import 'package:dio/dio.dart';
import 'package:dio_http_adapter/dio_http_adapter.dart';

void main() async {
  // 创建Dio实例
  final dio = Dio();

  // 创建HttpAdapter实例
  final adapter = HttpAdapter(dio);

  // 添加请求拦截器
  adapter.onRequest = (RequestOptions options) async {
    // 打印请求信息
    print("Sending request to ${options.path}");
    print("Request Method: ${options.method}");

    // 添加自定义头部信息(例如认证头部)
    options.headers['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN';

    // 可以根据需求修改请求数据
    // options.data = {...};

    // 返回RequestOptions对象,继续请求流程
    return options;
  };

  // 添加响应拦截器
  adapter.onResponse = (Response response) async {
    // 打印响应信息
    print("Received response from ${response.requestOptions.path}");
    print("Response Status Code: ${response.statusCode}");

    // 可以根据需求修改响应数据
    // final modifiedData = response.data;
    // response.data = modifiedData;

    // 返回Response对象,继续响应流程
    return response;
  };

  // 添加错误拦截器
  adapter.onError = (DioError err) async {
    // 打印错误信息
    print("Request failed: ${err.message}");

    // 可以根据错误类型进行不同的处理
    if (err.type == DioErrorType.RESPONSE) {
      // 服务器返回了错误响应码
      print("Response error data: ${err.response?.data}");
    } else if (err.type == DioErrorType.CONNECT_TIMEOUT || err.type == DioErrorType.SEND_TIMEOUT || err.type == DioErrorType.RECEIVE_TIMEOUT) {
      // 请求超时
      print("Request timed out");
    } else if (err.type == DioErrorType.CANCEL) {
      // 请求被取消
      print("Request was cancelled");
    } else {
      // 其他错误
      print("Other error: ${err.error}");
    }

    // 返回DioError对象,继续错误处理流程(可选)
    // 你可以抛出一个新的异常或返回null来忽略错误处理
    return err;
  };

  // 使用dio进行网络请求
  try {
    final response = await dio.get('https://jsonplaceholder.typicode.com/posts/1');
    print("Response Data: ${response.data}");
  } catch (e) {
    // 捕获并处理异常
    print("An error occurred: $e");
  }
}

在这个示例中:

  1. 我们创建了一个Dio实例和一个HttpAdapter实例。
  2. 使用adapter.onRequest添加了一个请求拦截器,用于打印请求信息并添加自定义头部。
  3. 使用adapter.onResponse添加了一个响应拦截器,用于打印响应信息。
  4. 使用adapter.onError添加了一个错误拦截器,用于打印错误信息并根据错误类型进行不同的处理。
  5. 最后,我们发起了一个GET请求,并打印了响应数据。

这样,你就能够在Flutter应用中使用dio_adapter来进行网络请求,并添加请求/响应的拦截逻辑。

回到顶部