> 文章列表 > Flutter Dio 库的简单封装

Flutter Dio 库的简单封装

Flutter Dio 库的简单封装

dio 库Flutter 中是比较流行的网络请求库。

其中在拦截器可以拦截请求,响应以及错误

  • 权限验证:比如接口请求后端返回401未授权时可以跳到登录页,403跳到未授权页面;
  • 异常监控:可以在拦截器处理异常,并且上报到异常监控后台或者发送异常预警消息;
  • 缓存接口:可以对于某些接口将请求缓存在本地,设定一定的缓存有效时限,在时限内重复请求时直接返回本地缓存数据,而无需请求后端接口,降低后端服务器负荷。这块可以参考dio-http-cache。
  • Cookie:App 本身是不会缓存 Cookie 信息的,可以使用拦截器在向后端发起请求时自动携带 Cookie信息,可以参考cookie_manager。
  • 生成接口文档:可以在拦截器将请求参数,返回结果输出为 Postman格式的接口文档,参考postman_dio。
  • 自定义拦截器:可以自定义自己的拦截器类,继承Interceptor类,实现 onRequestonResponseonError方法即可

简单封装三个文件

第一个HttpRequest

import 'package:awsome_flutter/jiezhi/widget/dio%E5%B0%81%E8%A3%85/http_auth_interceptor.dart';
import 'package:dio/dio.dart';
import 'http_config.dart';class HTTPRequest {static final BaseOptions options = BaseOptions(baseUrl: HTTPConfig.baseURL,connectTimeout: Duration(milliseconds: HTTPConfig.timeout));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) {// 很多页面访问必须要求携带token 那么可以在这里判断是否有token// 权限验证:比如接口请求后端返回401未授权时可以跳到登录页,403跳到未授权页面;// 异常监控:可以在拦截器处理异常,并且上报到异常监控后台或者发送异常预警消息;// 缓存接口:可以对于某些接口将请求缓存在本地,设定一定的缓存有效时限,在时限内重复请求时直接返回本地缓存数据,而无需请求后端接口,降低后端服务器负荷。这块可以参考print(options.baseUrl);print(options.path);print(options.uri);print("拦截了请求");return handler.next(options);},onResponse: (e, handler) {print(e);print("拦截了响应");return handler.next(e);},onError: (e, handler) {print(e);print("拦截了错误");return handler.next(e);},);List<Interceptor> inters = [];// 添加自己定义的授权拦截器inters.add(AuthInterCeptor());// 开启一个log 拦截器// 此拦截器将帮助您在发出 HTTP 请求和响应的同时创建所有日志。您将能够看到您请求的所有信息。/*** uri: https://api.oioweb.cn/api/qq/vip?qq=1023954998statusCode: 200headers:access-control-allow-headers: X-Requested-Withconnection: keep-aliveaccess-control-allow-origin: *date: Sun, 09 Apr 2023 06:30:44 GMTaccess-control-allow-methods: GET,POST,OPTIONScontent-encoding: gzipcontent-length: 563strict-transport-security: max-age=31536000content-type: application/json;charset=utf-8server: Tengine* * */inters.add(LogInterceptor());dio.interceptors.addAll(inters);// 3 发起网络请求try {Response response =await dio.request<T>(url, queryParameters: params, options: options);return response.data;} on DioError catch (e) {print("戳错了????");print(e);return Future.error(e);}}
}

第二个就是Http_config

class HTTPConfig {static const baseURL = "https://api.oioweb.cn";static const timeout = 5000;
}

第三个 自定义的拦截器

// 自定义一个拦截器
import 'package:dio/dio.dart';class AuthInterCeptor extends Interceptor {AuthInterCeptor();// 重写其方法@overridevoid onRequest(RequestOptions options, RequestInterceptorHandler handler) {// TODO: implement onRequest// 这里你可以创建一个path 列表,标记处不需要access_token的路径final listPath = ["/login", "/resgiter", "/sendMsgCode", "/api/qq/vip"];// 进行判断 是否需要追加tokenif (listPath.contains(options.path)) {print("/api/qq/vip");// 不需要token 直接返回return handler.next(options);}// 这里从本地读取自己的token 拼接上去String access_token = "access_token";options.headers.addAll({'Authorization': access_token});return handler.next(options);}@overridevoid onResponse(Response response, ResponseInterceptorHandler handler) {// TODO: implement onResponsesuper.onResponse(response, handler);}@overridevoid onError(DioError err, ErrorInterceptorHandler handler) {// TODO: implement onErrorsuper.onError(err, handler);}
}