Flutter如何通过retrofit和dio实现统一网络请求

在Flutter项目中,我想通过retrofit和dio实现统一的网络请求管理,但遇到几个问题:

  1. retrofit如何与dio结合使用?是否需要额外配置?
  2. 统一的请求拦截和错误处理该怎么实现?比如在dio中全局处理401错误或token刷新
  3. 能否给出一个完整的示例,包括请求封装、响应解析和异常捕获的最佳实践?
  4. 如何处理不同API的差异化需求(如部分接口需要特殊header)?
    目前尝试时总感觉代码分散,求指教!
2 回复

使用 Retrofit 和 Dio 实现统一网络请求的步骤:

  1. 添加依赖:dioretrofitjson_annotation 等。
  2. 创建数据模型,使用 json_serializable 注解。
  3. 定义 API 接口,用 @RestApi 注解,声明请求方法。
  4. 通过 Retrofit 生成请求类,结合 Dio 实例配置基础 URL、拦截器等。
  5. 在拦截器中统一处理错误、日志和令牌。

示例代码:

@RestApi(baseUrl: "https://api.example.com/")
abstract class ApiClient {
  factory ApiClient(Dio dio) = _ApiClient;
  @GET("/user")
  Future<User> getUser();
}

更多关于Flutter如何通过retrofit和dio实现统一网络请求的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,通过Retrofit和Dio实现统一网络请求,可以简化HTTP请求的编写和管理。以下是具体实现步骤:

1. 添加依赖

pubspec.yaml 中添加:

dependencies:
  retrofit: ^5.0.0
  dio: ^5.0.0
  logger: ^2.0.0

dev_dependencies:
  retrofit_generator: ^5.0.0
  build_runner: ^2.0.0

2. 创建Dio实例与配置

创建 dio_client.dart 文件,配置Dio实例(如超时、拦截器等):

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

final dio = Dio(BaseOptions(
  baseUrl: 'https://api.example.com',
  connectTimeout: const Duration(seconds: 10),
  receiveTimeout: const Duration(seconds: 10),
))
..interceptors.add(LogInterceptor(
  requestBody: true,
  responseBody: true,
));

3. 定义API接口

创建 api_service.dart 文件,使用Retrofit注解定义接口:

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

part 'api_service.g.dart';

@RestApi(baseUrl: 'https://api.example.com')
abstract class ApiService {
  factory ApiService(Dio dio, {String baseUrl}) = _ApiService;

  @GET('/users')
  Future<List<User>> getUsers();

  @POST('/users')
  Future<User> createUser(@Body() User user);
}

4. 生成代码

运行命令生成实现代码:

flutter pub run build_runner build

5. 统一请求处理

创建 network_manager.dart 封装统一逻辑:

class NetworkManager {
  static final ApiService _apiService = ApiService(dio);

  static Future<T> request<T>(Future<T> Function() apiCall) async {
    try {
      return await apiCall();
    } on DioException catch (e) {
      throw _handleError(e);
    }
  }

  static String _handleError(DioException e) {
    switch (e.type) {
      case DioExceptionType.connectionTimeout:
        return '连接超时';
      case DioExceptionType.badResponse:
        return '服务器错误: ${e.response?.statusCode}';
      default:
        return '网络请求失败';
    }
  }
}

// 使用示例
Future<void> fetchUsers() async {
  final users = await NetworkManager.request(() => _apiService.getUsers());
  print(users);
}

关键点说明

  • Dio配置:统一设置超时、拦截器(日志、认证等)
  • Retrofit注解:简化API定义,自动生成实现代码
  • 错误处理:集中管理网络异常和业务错误
  • 统一入口:通过 NetworkManager 封装所有请求,便于维护

通过这种方式,可以实现简洁、可维护的网络请求架构,适合中大型Flutter项目。

回到顶部