网络拦截器 - Flutter在鸿蒙平台处理HTTP请求
概述在Flutter应用开发中网络请求是不可或缺的一部分。为了统一处理HTTP请求的认证、日志、错误处理等逻辑使用拦截器是一个很好的实践。Dio库提供了强大的拦截器机制可以在请求发送前、响应返回后、错误发生时进行统一处理。本文将详细介绍网络拦截器的核心概念、使用方法、高级特性以及在鸿蒙平台上的实现细节。核心概念什么是网络拦截器网络拦截器是一种中间件机制允许在HTTP请求的各个阶段插入自定义逻辑阶段拦截器类型作用请求发送前请求拦截器添加认证信息、日志记录、参数加密响应返回后响应拦截器数据解析、日志记录、错误处理错误发生时错误拦截器错误重试、错误转换、错误上报拦截器的优势代码复用将通用逻辑抽离到拦截器中统一处理集中处理认证、日志、错误等逻辑易于维护修改逻辑只需改动拦截器解耦合业务代码与网络层解耦拦截器链多个拦截器可以组成一个拦截器链按照顺序执行请求 → 拦截器1 → 拦截器2 → ... → 服务器 响应 → 拦截器n → 拦截器n-1 → ... → 业务代码基本使用安装依赖dependencies:dio:^5.4.0创建请求拦截器importpackage:dio/dio.dart;classAuthInterceptorextendsInterceptor{overridevoidonRequest(RequestOptionsoptions,RequestInterceptorHandlerhandler){options.headers[Authorization]Bearer token;super.onRequest(options,handler);}}创建响应拦截器classLoggingInterceptorextendsInterceptor{overridevoidonResponse(Responseresponse,ResponseInterceptorHandlerhandler){print(RESPONSE:${response.data});super.onResponse(response,handler);}}添加拦截器到DiofinaldioDio();dio.interceptors.add(AuthInterceptor());dio.interceptors.add(LoggingInterceptor());核心代码示例代码示例1认证拦截器importpackage:dio/dio.dart;importpackage:shared_preferences/shared_preferences.dart;classAuthInterceptorextendsInterceptor{overridevoidonRequest(RequestOptionsoptions,RequestInterceptorHandlerhandler)async{finalprefsawaitSharedPreferences.getInstance();finaltokenprefs.getString(access_token);if(token!null){options.headers[Authorization]Bearer$token;}options.headers[Content-Type]application/json;super.onRequest(options,handler);}overridevoidonResponse(Responseresponse,ResponseInterceptorHandlerhandler){if(response.statusCode401){}super.onResponse(response,handler);}overridevoidonError(DioExceptionerr,ErrorInterceptorHandlerhandler){if(err.response?.statusCode401){}super.onError(err,handler);}}代码说明请求拦截在请求发送前添加认证token和Content-Type响应拦截处理401状态码token过期错误拦截处理请求错误时的401状态码异步操作使用SharedPreferences获取token代码示例2日志拦截器classLoggingInterceptorextendsInterceptor{overridevoidonRequest(RequestOptionsoptions,RequestInterceptorHandlerhandler){print(REQUEST[${options.method}] PATH:${options.path});print(HEADERS:${options.headers});if(options.data!null){print(BODY:${options.data});}super.onRequest(options,handler);}overridevoidonResponse(Responseresponse,ResponseInterceptorHandlerhandler){print(RESPONSE[${response.statusCode}] PATH:${response.requestOptions.path});print(DATA:${response.data});super.onResponse(response,handler);}overridevoidonError(DioExceptionerr,ErrorInterceptorHandlerhandler){print(ERROR[${err.response?.statusCode}] PATH:${err.requestOptions.path});print(ERROR:$err);super.onError(err,handler);}}代码说明请求日志记录请求方法、路径、头信息和请求体响应日志记录响应状态码、路径和响应数据错误日志记录错误状态码、路径和错误信息调试方便帮助开发者调试网络请求代码示例3API客户端封装importpackage:dio/dio.dart;classApiClient{staticlateDio_dio;staticvoidinit(){_dioDio(BaseOptions(baseUrl:https://api.example.com,connectTimeout:constDuration(seconds:10),receiveTimeout:constDuration(seconds:10),));_dio.interceptors.add(AuthInterceptor());_dio.interceptors.add(LoggingInterceptor());_dio.interceptors.add(RetryInterceptor(dio:_dio,options:constRetryOptions(retries:3,retryInterval:Duration(seconds:1),retryEvaluator:_defaultRetryEvaluator,),));}staticbool_defaultRetryEvaluator(DioExceptionerror){returnerror.typeDioExceptionType.connectionTimeout||error.typeDioExceptionType.receiveTimeout||error.typeDioExceptionType.sendTimeout;}staticDiogetinstance_dio;staticFutureResponseget(Stringpath,{MapString,dynamic?queryParameters})async{returnawait_dio.get(path,queryParameters:queryParameters);}staticFutureResponsepost(Stringpath,{dynamicdata})async{returnawait_dio.post(path,data:data);}staticFutureResponseput(Stringpath,{dynamicdata})async{returnawait_dio.put(path,data:data);}staticFutureResponsedelete(Stringpath)async{returnawait_dio.delete(path);}}代码说明单例模式使用静态实例避免重复创建基础配置设置baseUrl、超时时间拦截器链添加认证、日志、重试拦截器请求方法封装GET、POST、PUT、DELETE方法重试逻辑对超时错误自动重试3次代码示例4错误处理拦截器classErrorInterceptorextendsInterceptor{overridevoidonError(DioExceptionerr,ErrorInterceptorHandlerhandler){finalerrorMessage_getErrorMessage(err);print(Error:$errorMessage);finalcustomErrorApiError(code:err.response?.statusCode??-1,message:errorMessage,originalError:err,);handler.reject(DioException(requestOptions:err.requestOptions,error:customError,type:err.type,response:err.response,));}String_getErrorMessage(DioExceptionerr){switch(err.type){caseDioExceptionType.connectionTimeout:return连接超时;caseDioExceptionType.sendTimeout:return发送超时;caseDioExceptionType.receiveTimeout:return接收超时;caseDioExceptionType.badResponse:return服务器错误${err.response?.statusCode};caseDioExceptionType.cancel:return请求已取消;caseDioExceptionType.connectionError:return网络连接错误;default:return未知错误;}}}classApiError{finalint code;finalStringmessage;finalDioExceptionoriginalError;ApiError({requiredthis.code,requiredthis.message,requiredthis.originalError,});}代码说明错误转换将DioException转换为自定义ApiError错误消息根据错误类型提供友好的错误消息错误信息保存原始错误信息便于调试错误码提取HTTP状态码高级特性1. 请求重试dio.interceptors.add(RetryInterceptor(dio:dio,options:constRetryOptions(retries:3,retryInterval:Duration(seconds:1),retryEvaluator:(error)error.typeDioExceptionType.connectionTimeout,),));2. 请求缓存classCacheInterceptorextendsInterceptor{finalMapString,Response_cache{};overridevoidonRequest(RequestOptionsoptions,RequestInterceptorHandlerhandler){if(options.methodGET){finalcachedResponse_cache[options.path];if(cachedResponse!null){handler.resolve(cachedResponse);return;}}handler.next(options);}overridevoidonResponse(Responseresponse,ResponseInterceptorHandlerhandler){if(response.requestOptions.methodGET){_cache[response.requestOptions.path]response;}handler.next(response);}}3. 请求限流classRateLimitInterceptorextendsInterceptor{int _requestCount0;DateTime?_lastResetTime;overridevoidonRequest(RequestOptionsoptions,RequestInterceptorHandlerhandler){finalnowDateTime.now();if(_lastResetTimenull||now.difference(_lastResetTime!)constDuration(seconds:1)){_requestCount0;_lastResetTimenow;}if(_requestCount10){handler.reject(DioException(requestOptions:options,error:Rate limit exceeded,));}else{_requestCount;handler.next(options);}}}4. 参数加密classEncryptionInterceptorextendsInterceptor{overridevoidonRequest(RequestOptionsoptions,RequestInterceptorHandlerhandler){if(options.data!null){options.data_encrypt(options.data);}handler.next(options);}dynamic_encrypt(dynamicdata){returndata;}}在鸿蒙平台的实现鸿蒙平台适配鸿蒙平台对Flutter网络请求的支持与Android类似因为鸿蒙兼容Android应用。需要注意以下几点网络权限需要在module.json5中声明网络权限HTTPS支持鸿蒙平台支持HTTPS请求网络代理可以配置网络代理进行调试鸿蒙平台权限配置在module.json5中配置网络权限{module:{requestPermissions:[{name:ohos.permission.INTERNET,reason:需要网络权限发送HTTP请求,usedScene:{ability:[{name:MainAbility,when:inuse}],permissionFlags:[grantMode:system_grant]}}]}}鸿蒙平台注意事项网络安全鸿蒙平台要求使用HTTPS连接证书验证需要正确配置SSL证书代理配置调试时可以配置网络代理性能对比操作无拦截器有拦截器请求时间正常略有增加毫秒级代码复杂度高重复逻辑低统一处理可维护性差好最佳实践1. 封装API客户端将所有网络请求封装在API客户端中classApiClient{staticFutureUsergetUser(int id)async{finalresponseawait_dio.get(/users/$id);returnUser.fromJson(response.data);}staticFutureListUsergetUsers()async{finalresponseawait_dio.get(/users);return(response.dataasList).map((e)User.fromJson(e)).toList();}}2. 统一错误处理在错误拦截器中统一处理错误classErrorInterceptorextendsInterceptor{overridevoidonError(DioExceptionerr,ErrorInterceptorHandlerhandler){finalerror_handleError(err);handler.reject(error);}DioException_handleError(DioExceptionerr){// 统一错误处理逻辑returnerr;}}3. 合理使用拦截器根据需求选择合适的拦截器dio.interceptors.add(AuthInterceptor());dio.interceptors.add(LoggingInterceptor());dio.interceptors.add(ErrorInterceptor());4. 避免重复拦截不要在多个地方添加相同的拦截器// 错误示例dio.interceptors.add(AuthInterceptor());dio.interceptors.add(AuthInterceptor());// 重复添加5. 测试拦截器编写测试用例验证拦截器功能voidmain(){test(AuthInterceptor adds token,()async{finaldioDio();dio.interceptors.add(AuthInterceptor());// 测试拦截器是否正确添加token});}常见问题Q1: 拦截器不生效怎么办A检查以下几点是否正确添加了拦截器到Dio实例拦截器的顺序是否正确是否调用了handler.next()或handler.resolve()Q2: 如何在拦截器中获取上下文A可以通过RequestOptions的extra参数传递上下文dio.get(/users,options:Options(extra:{context:context}));Q3: 拦截器可以异步操作吗A可以请求拦截器支持异步操作overridevoidonRequest(RequestOptionsoptions,RequestInterceptorHandlerhandler)async{finaltokenawaitgetToken();options.headers[Authorization]token;handler.next(options);}Q4: 如何取消请求A使用CancelToken取消请求finalcancelTokenCancelToken();dio.get(/users,cancelToken:cancelToken);cancelToken.cancel(Request cancelled);Q5: 如何处理HTTPS证书问题A可以通过配置Dio的HttpClientAdapter来处理dio.httpClientAdapterHttp2Adapter(ConnectionManager(idleTimeout:constDuration(seconds:10),),);总结网络拦截器是Flutter应用中处理HTTP请求的重要机制通过Dio库的拦截器可以实现认证、日志、错误处理等统一逻辑。在鸿蒙平台上网络拦截器的实现与Android类似但需要注意网络权限和HTTPS配置。选择合适的拦截器需要根据应用需求来决定拦截器适用场景特点认证拦截器需要登录的应用自动添加认证信息日志拦截器开发调试记录请求和响应信息错误拦截器所有应用统一错误处理重试拦截器不稳定网络自动重试失败请求希望本文能帮助你更好地理解和使用网络拦截器在Flutter应用中处理HTTP请求。

相关新闻

Python的数据存储与运算符

Python的数据存储与运算符

大家好,最近在系统学习 Python 基础,把核心知识点整理成这份笔记,分享给正在入门 Python 的朋友们。零基础学编程,基础概念一定要吃透,下面跟着我的笔记一起梳理重点!1. 变量定义格式Python 定义变量语法十…

2026/7/23 2:18:53阅读更多 →
英灵神殿挂?用“神器”白嫖私人服务器,告别卡顿

英灵神殿挂?用“神器”白嫖私人服务器,告别卡顿

还在为《英灵神殿》官方服务器的高延迟和“英灵神殿挂”(指利用网络延迟或外挂破坏游戏体验)而烦恼吗?与其在拥挤的官方服里和“神仙”斗智斗勇,不如自己白嫖一个专属的私人服务器,只邀请信得过的朋友加入,…

2026/7/23 2:18:53阅读更多 →
VS Code 与 Flutter:高效移动开发的完美组合

VS Code 与 Flutter:高效移动开发的完美组合

1. 引言 在 Flutter 移动开发领域,选择一个合适的集成开发环境(IDE)至关重要。Visual Studio Code(简称 VS Code)凭借其轻量、高效和强大的扩展生态,已成为众多 Flutter 开发者的首选工具。本文将详细介绍…

2026/7/23 2:18:53阅读更多 →
Linux 嵌入式 C 学习 Day3|变量、类型转换、全量运算符、IO 输入输出完整笔记

Linux 嵌入式 C 学习 Day3|变量、类型转换、全量运算符、IO 输入输出完整笔记

前言 前两日吃透 Linux 操作、gcc 四步编译、C 语言基础数据类型,今天 Day3 深入程序核心:变量规范、初始化、隐式/强制类型转换、全套运算符、printf/scanf/getchar/putchar 输入输出,覆盖嵌入式 C 最常用的运算与交互逻辑,配套…

2026/7/23 6:27:32阅读更多 →
pybind11异常处理:C++异常到Python的完美映射实战指南

pybind11异常处理:C++异常到Python的完美映射实战指南

1. 项目概述:为什么C异常处理在Python绑定中是块硬骨头?如果你用pybind11做过C库的Python绑定,大概率踩过这个坑:在C里抛出一个std::runtime_error,满心期待它在Python里变成一个漂亮的RuntimeError异常,结…

2026/7/23 6:27:32阅读更多 →
为什么越来越多人需要 AI 数字分身?不是为了替你工作,而是让专业持续被看见

为什么越来越多人需要 AI 数字分身?不是为了替你工作,而是让专业持续被看见

你有没有过这样的经历: 明明有经验、有产品,也知道客户真正关心什么,却总是没有时间持续发内容。忙完一天,想录一条视频,灯光没调好;想写一篇文章,又不知道从哪里开始。等终于准备好&#xff0c…

2026/7/23 6:27:32阅读更多 →
C++与Eigen实现卡尔曼滤波:从原理到二维轨迹追踪实战

C++与Eigen实现卡尔曼滤波:从原理到二维轨迹追踪实战

1. 项目概述与核心价值 如果你在C项目中处理过传感器融合、机器人定位或者任何需要从带噪声的观测数据中估计系统状态的任务,那么“卡尔曼滤波器”这个名字对你来说一定不陌生。它就像一个聪明的“数据清洁工”和“状态预言家”的结合体,能从一堆杂乱无章…

2026/7/23 6:27:32阅读更多 →
接口防抖容错技术|从红薯低风险稳输出,解析跨境接口高兼容容错方案

接口防抖容错技术|从红薯低风险稳输出,解析跨境接口高兼容容错方案

西班牙红薯饭低负担、低风险、高适配的特性,让球员在各类突发赛场场景中保持状态稳定,杜绝失误崩盘。反向海淘系统依赖海量三方接口,上游电商采购接口、跨境物流轨迹接口、海外支付接口、清关申报接口频繁波动、限流、返回异常数据&#xff0…

2026/7/23 6:27:32阅读更多 →
京呈GB3731cdn四色套装:高性价比激光打印机耗材解析

京呈GB3731cdn四色套装:高性价比激光打印机耗材解析

1. 产品定位与核心优势解析京呈GB3731cdn四色套装是专为立思达LANXUM彩色激光打印机设计的耗材解决方案。作为第三方兼容耗材,它直接对标原装GB3731cdn墨盒2093系列,在保证打印质量的前提下,通过优化碳粉配方和机械结构实现了更具性价比的使用…

2026/7/23 6:25:32阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/22 18:55:50阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/22 18:55:50阅读更多 →