Flutter网络请求全攻略_Dio封装与接口调试教程

在Flutter中使用Dio进行网络请求时,如何优雅地封装请求库?比如统一处理错误码、添加公共参数和拦截器的最佳实践是什么?

接口调试过程中遇到DioError异常(如连接超时或状态码错误),有哪些通用的排查思路和解决方案?

能否分享一个完整的Dio封装示例,包含缓存管理、Token自动刷新和日志打印功能?

对比原生HttpClient,Dio在性能优化方面需要注意哪些关键点?比如并发请求或文件上传时的细节处理?

3 回复

作为一个屌丝程序员,我来简单分享下Flutter中使用Dio进行网络请求的套路。

首先安装dio依赖:dependencies: dio: ^4.0.0。然后封装一个工具类,比如ApiUtils.dart:

import 'package:dio/dio.dart';

final dio = Dio();

class ApiUtils {
  static Future<T> request<T>(String url, {data, Options options}) async {
    try {
      final response = await dio.post(url, data: data, options: options);
      return response.data;
    } catch (e) {
      print(e);
      throw e;
    }
  }
}

在调试时可以设置baseUrl和拦截器:

dio.options.baseUrl = 'https://api.example.com/';
dio.interceptors.add(InterceptorsWrapper(
  onRequest: (options) {
    print('请求: ${options.method} ${options.uri}');
    return options;
  },
  onResponse: (response) {
    print('响应: ${response.statusCode} ${response.requestOptions.uri}');
    return response;
  },
));

实际使用时,通过Future异步调用接口,记得处理错误和Loading状态。这样封装后,调用接口就很简单了。

更多关于Flutter网络请求全攻略_Dio封装与接口调试教程的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


作为一个屌丝程序员,最近在研究Flutter网络请求,发现Dio库确实好用。首先安装dio依赖,配置代理方便联调。接着封装一个HttpUtils类,设置baseUrl、超时时间等全局参数。比如:

import 'package:dio/dio.dart';

class HttpUtils {
  static final Dio dio = Dio(BaseOptions(
    baseUrl: "https://api.example.com",
    connectTimeout: 5000,
    receiveTimeout: 3000,
  ));

  static Future request(String url, {Map<String, dynamic>? params, Options? options}) async {
    try {
      Response response = await dio.get(url, queryParameters: params);
      return response.data;
    } catch (e) {
      print(e);
      throw Exception("网络请求失败");
    }
  }
}

调试时可以使用Postman或Mock API,本地开发阶段建议通过拦截器打印日志,方便定位问题。记得处理异常和错误码哦!

Flutter网络请求:Dio封装与接口调试指南

Dio基础使用

Dio是Flutter中功能强大的HTTP客户端,首先添加依赖:

dependencies:
  dio: ^5.0.0

基本请求示例:

import 'package:dio/dio.dart';

final dio = Dio();

// GET请求
Response response = await dio.get('https://example.com/api');

// POST请求
Response response = await dio.post(
  'https://example.com/api',
  data: {'key': 'value'},
);

封装Dio客户端

推荐封装一个可复用的Dio客户端:

class HttpUtil {
  static final HttpUtil _instance = HttpUtil._internal();
  factory HttpUtil() => _instance;
  late Dio dio;

  HttpUtil._internal() {
    dio = Dio(BaseOptions(
      baseUrl: 'https://your.api.com',
      connectTimeout: Duration(seconds: 10),
      receiveTimeout: Duration(seconds: 10),
    ));

    // 添加拦截器
    dio.interceptors.add(InterceptorsWrapper(
      onRequest: (options, handler) {
        // 请求前处理,如添加token
        options.headers['Authorization'] = 'Bearer token';
        return handler.next(options);
      },
      onResponse: (response, handler) {
        // 统一处理响应
        return handler.next(response);
      },
      onError: (DioException e, handler) {
        // 统一错误处理
        return handler.next(e);
      },
    ));
  }

  Future<Response> get(String path, {Map<String, dynamic>? params}) async {
    return await dio.get(path, queryParameters: params);
  }

  Future<Response> post(String path, {dynamic data}) async {
    return await dio.post(path, data: data);
  }
}

接口调试技巧

  1. 日志拦截器:添加日志输出
dio.interceptors.add(LogInterceptor(
  request: true,
  requestHeader: true,
  requestBody: true,
  responseHeader: true,
  responseBody: true,
));
  1. 使用Postman测试接口:先确保接口在Postman中正常工作

  2. Mock数据:开发阶段可以使用Mock数据

dio.httpClientAdapter = IOHttpClientAdapter()
  ..onHttpClientCreate = (client) {
    client.findProxy = (uri) => "PROXY localhost:8888"; // Charles代理
    return client;
  };
  1. 错误处理
try {
  var response = await HttpUtil().get('/api');
} on DioException catch (e) {
  if (e.response != null) {
    print(e.response?.data);
    print(e.response?.headers);
    print(e.response?.statusCode);
  } else {
    print(e.message);
  }
}

这些技巧和封装方法可以帮助你更高效地进行Flutter网络请求开发。

回到顶部