当前位置: 首页 > news >正文

Flutter 中自定义DNS解析的实现

为了提升Flutter中网络请求的速度,集成了阿里云的DNS解析服务,在官方示例中未提供基于Dio的实现, 因此经过调研后,尝试基于Dio进行自定义扩展实现,最开始做的时候,首先想到的是使用自定义Dio的拦截器进行实现,经过一系列的调研后,发现Dio中拦截器的执行顺序是在DNS解析之后,所以即使在拦截器中实现了DNS解析,也毫无意义,因此采用了自定义Proxy代理的方式进行实现。

第一步创建Proxy

class DomainHttpClientAdapter extends HttpClientAdapter {@overridevoid close({bool force = false}) {}//需要解析的域名var spareHostArray = ["taobo",];@overrideFuture<ResponseBody> fetch(RequestOptions options, Stream<Uint8List>? requestStream, Future<dynamic>? cancelFuture) async {// 自定义 DNS 解析LogUtils.d("DomainHttpClientAdapter------------>fetch-->${options.uri.host}");Uri newUri = options.uri;if (spareHostArray.contains(options.uri.host)) {String host = options.uri.host;String ipAddress = await _resolveHostToIp(host);int port = options.uri.port;String scheme = options.uri.scheme;String newPath = '$scheme://$ipAddress:$port${options.uri.path}${options.uri.query}';LogUtils.d("DomainHttpClientAdapter------------>newPath->$newPath-->");options.baseUrl = newPath;options.path = "";}final HttpClient httpClient = HttpClient();LogUtils.d("DomainHttpClientAdapter------------>openUrl-newUri->$newUri--baseUrl->${options.baseUrl}");final HttpClientRequest httpRequest = await httpClient.openUrl(options.method, newUri);// 设置请求头options.headers.forEach((key, value) {httpRequest.headers.set(key, value);});// 写入请求体if (requestStream != null) {await requestStream.forEach(httpRequest.add);}final HttpClientResponse httpResponse = await httpRequest.close();// 读取响应数据final List<int> responseBody = await httpResponse.fold([], (List<int> a, List<int> b) => a..addAll(b));return ResponseBody.fromBytes(responseBody,httpResponse.statusCode,headers: convertHeaders(httpResponse.headers),statusMessage: httpResponse.reasonPhrase,);}// 将 HttpHeaders 转换为 Dio 需要的 headers 格式Map<String, List<String>> convertHeaders(HttpHeaders headers) {Map<String, List<String>> convertedHeaders = {};headers.forEach((name, values) {convertedHeaders[name] = values;});return convertedHeaders;}///使用通道,发送消息到原生进行DNS解析Future<String> _resolveHostToIp(String host) async {try{var ip =  await ChannelManager.getInstance().sendMessage("getIpByHost",host);LogUtils.d("DomainHttpClientAdapter------------>_resolveHostToIp-->$ip");return ip;}catch(e){return host;}}
}

第二步,给Dio增加自定义代理

dio.httpClientAdapter = DomainHttpClientAdapter();

通过如上两步即可实现Flutter中自定义DNS解析,本案例只作为参考,提供一种自定义解析DNS的实现方案,具体实现,可根据自己项目进行定制实现。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 移动式气象站:便携科技的天气守望者
  • 制作excel模板,用于管理后台批量导入船舶数据
  • 优选算法之位运算
  • React基础知识 精简全面 推荐
  • AI绘画3分钟解决英文恐惧症,comfyui汉化插件
  • 安装python插件命令集合
  • 分布式文件存储行业解决方案和技术选型分析
  • 【MySQL进阶之路 | 高级篇】显式事务和隐式事务
  • electron 网页TodoList应用打包win桌面软件数据持久化
  • 00-从零开始安装Oracle19c之数据库安装规划
  • 这款ERP云进销存系统,直接封神
  • 【排序】快速排序详解
  • 《学会 SpringMVC 系列 · 基础篇》
  • 华为OD机试 - Wonderland游乐园 - 动态规划(Java 2024 D卷 200分)
  • 遥感领域新方向!Mamba+RS论文汇总!
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Angular 响应式表单 基础例子
  • CAP理论的例子讲解
  • Debian下无root权限使用Python访问Oracle
  • JS学习笔记——闭包
  • linux安装openssl、swoole等扩展的具体步骤
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • React-flux杂记
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Vue2.0 实现互斥
  • Vue实战(四)登录/注册页的实现
  • 成为一名优秀的Developer的书单
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 王永庆:技术创新改变教育未来
  • 为视图添加丝滑的水波纹
  • 小而合理的前端理论:rscss和rsjs
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​queue --- 一个同步的队列类​
  • ​zookeeper集群配置与启动
  • ​字​节​一​面​
  • (003)SlickEdit Unity的补全
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (十八)三元表达式和列表解析
  • (一) springboot详细介绍
  • (一)RocketMQ初步认识
  • (一)SpringBoot3---尚硅谷总结
  • (一)VirtualBox安装增强功能
  • (一)基于IDEA的JAVA基础10
  • (转)JAVA中的堆栈
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET的微型Web框架 Nancy
  • .net中的Queue和Stack