深度解析Flutter:一文把握dio网络恳求库的封装

深度解析Flutter:一文把握dio网络恳求库的封装

封装网络库考虑的几个方面:

恳求参数的封装:

将恳求所需的参数进行封装,例如 URL、恳求头、恳求体等。能够界说一个一致的数据结构或模型类来表示恳求参数,以便于传递和管理。

呼应成果的封装:

将网络恳求回来的呼应成果进行封装,例如状况码、呼应头、呼应体等。同样,能够界说一个一致的数据结构或模型类来表示呼应成果,以便于处理和解析。

过错处理的封装:

对网络恳求可能出现的过错进行封装和处理,例如网络衔接失败、超时、服务器过错等。能够界说自界说的反常类或过错码,以及相应的过错处理机制。

拦截器的封装:

如果第三方网络库支持拦截器机制,你能够封装拦截器,用于在恳求建议前或呼应回来后进行额外的处理,如增加身份验证、日志记录等。

封装示例

/*
 * @Author: HaiJun
 * @FilePath: flutter_demo_showlibutilshttp.dart
 * @Description: 
 * 
 */
import 'package:dio/dio.dart';
import './CustomInterceptor.dart';
class HttpApi {
  // 装备基本的恳求选项
  static final BaseOptions options = BaseOptions(
    baseUrl: 'http://localhost:3001/', // 设置恳求的根底 URL
    method: 'GET', //默认恳求方法
    connectTimeout: const Duration(seconds: 5), // 设置衔接超时时刻为 5 秒
    receiveTimeout: const Duration(seconds: 3), // 设置接纳超时时刻为 3 秒
    headers: {
      'User-Agent': 'Dio', // 设置恳求头信息
    },
  );
  static Dio dio = Dio(options);
  static Future<T> request<T>(String url,
      {String method = "get", Map<String, dynamic>? params}) async {
    // 1恳求的独自装备
    final options = Options(method: method);
    // 2 增加一个拦截器
    Interceptor inter = InterceptorsWrapper(
      onRequest: (options, handler) {
        return handler.next(options);
      },
      onResponse: (e, handler) {
        print(e);
        return handler.next(e);
      },
      onError: (e, handler) {
        print(e);
        return handler.next(e);
      },
    );
    List<Interceptor> inters = [];
    inters.add(CustomInterceptor()); //增加自界说拦截器
    inters.add(LogInterceptor()); //增加内置拦截器
    dio.interceptors.addAll(inters);
    // 3 建议网络恳求
    try {
      Response response =
          await dio.request<T>(url, queryParameters: params, options: options);
      print("测试");
      print(url);
      return response.data;
    } catch (e) {
      print(e);
      return Future.error(e);
    }
  }
}

调用恳求

把封装好的文件导入进来,

import 'package:flutter/material.dart';
import 'utils/http.dart';
class MyNetwork extends StatefulWidget {
  const MyNetwork({super.key});
  @override
  State<MyNetwork> createState() => _MyNetworkState();
}
class _MyNetworkState extends State<MyNetwork> {
  void getData() async {
    print("建议恳求");
    var responseData = await HttpApi.request('book');
    print(responseData);
  }
  @override
  Widget build(BuildContext context) {
    return Container(
        child: Column(children: [
      ElevatedButton(
          onPressed: () {
            getData();
          },
          child: const Text("建议恳求"))
    ]));
  }
}

utils/http.dart文件中,咱们封装了 dio ,创建了dio示例,传入了默认装备项,而且绑定了拦截器,在建议恳求时,也会走恳求拦截器,看参数是否合法,后会进入呼应拦截器,状况码是否对以及不同状况码回来不同内容,最后将回来成果数据抛给客户端呼应。

utils/http.dart文件中, 有一个 request异步 静态(static)方法,它供给了恳求时需求填的必填参数和可选参数,当咱们使用时,能够通过 类名.方法名 即可调用建议恳求了。

深度解析Flutter:一文把握dio网络恳求库的封装

恳求回来内容

最后

❤️关注+点赞+收藏+评论+转发❤️,原创不易,鼓舞笔者创造更好的文章