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

常用第三方库:dio网络库使用与封装

常用第三方库:dio网络库使用与封装

前言

dio是Flutter生态中最受欢迎的网络请求库之一,它提供了强大的功能和灵活的配置选项。本文将从实战角度深入介绍dio的使用技巧和最佳实践。

基础知识

1. dio简介

dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时等特性。

2. 基本使用

// 安装依赖
// pubspec.yaml
dependencies:dio: ^5.3.2// 基本使用示例
import 'package:dio/dio.dart';final dio = Dio();// GET请求
Response response = await dio.get('https://api.example.com/users');// POST请求
Response response = await dio.post('https://api.example.com/users',data: {'name': 'test', 'age': 25},
);

3. 配置选项

final dio = Dio(BaseOptions(baseUrl: 'https://api.example.com',connectTimeout: Duration(seconds: 5),receiveTimeout: Duration(seconds: 3),headers: {'Authorization': 'Bearer token','Content-Type': 'application/json',},
));

进阶特性

1. 拦截器

拦截器是dio的一大特色,可以在请求发起前和响应返回后进行统一处理。

class CustomInterceptor extends Interceptor {void onRequest(RequestOptions options, RequestInterceptorHandler handler) {// 在请求发起前统一添加tokenoptions.headers['Authorization'] = 'Bearer ${getToken()}';handler.next(options);}void onResponse(Response response, ResponseInterceptorHandler handler) {// 统一处理响应数据if (response.data['code'] == 0) {handler.next(response);} else {handler.reject(DioException(requestOptions: response.requestOptions,response: response,error: response.data['message'],));}}void onError(DioException err, ErrorInterceptorHandler handler) {// 统一错误处理if (err.response?.statusCode == 401) {// 处理token过期refreshToken().then((newToken) {// 重试请求dio.fetch(err.requestOptions);});}handler.next(err);}
}// 添加拦截器
dio.interceptors.add(CustomInterceptor());

2. 请求取消

// 创建取消令牌
final cancelToken = CancelToken();// 发起请求
dio.get('https://api.example.com/data',cancelToken: cancelToken).then((response) {print(response.data);
}).catchError((error) {if (CancelToken.isCancel(error)) {print('请求被取消');}
});// 取消请求
cancelToken.cancel('用户取消');

3. 文件上传下载

// 文件上传
FormData formData = FormData.fromMap({'file': await MultipartFile.fromFile('./text.txt',filename: 'text.txt',),
});Response response = await dio.post('/upload',data: formData,onSendProgress: (int sent, int total) {print('上传进度:${sent / total}');},
);// 文件下载
Response response = await dio.download('https://example.com/file.pdf','./file.pdf',onReceiveProgress: (int received, int total) {print('下载进度:${received / total}');},
);

实战案例:网络请求封装

1. 统一的网络请求类

class HttpClient {static final HttpClient _instance = HttpClient._internal();late Dio dio;factory HttpClient() => _instance;HttpClient._internal() {dio = Dio(BaseOptions(baseUrl: 'https://api.example.com',connectTimeout: Duration(seconds: 5),receiveTimeout: Duration(seconds: 3),));// 添加拦截器dio.interceptors.add(CustomInterceptor());// 添加缓存拦截器dio.interceptors.add(CacheInterceptor());// 添加重试拦截器dio.interceptors.add(RetryInterceptor(dio: dio,retries: 3,retryDelays: const [Duration(seconds: 1),Duration(seconds: 2),Duration(seconds: 3),],),);}Future<T> get<T>(String path, {Map<String, dynamic>? params,Options? options,CancelToken? cancelToken,}) async {try {final response = await dio.get(path,queryParameters: params,options: options,cancelToken: cancelToken,);return _handleResponse<T>(response);} catch (e) {return _handleError(e);}}Future<T> post<T>(String path, {dynamic data,Map<String, dynamic>? params,Options? options,CancelToken? cancelToken,}) async {try {final response = await dio.post(path,data: data,queryParameters: params,options: options,cancelToken: cancelToken,);return _handleResponse<T>(response);} catch (e) {return _handleError(e);}}T _handleResponse<T>(Response response) {if (response.data['code'] == 0) {return response.data['data'];} else {throw ApiException(code: response.data['code'],message: response.data['message'],);}}Never _handleError(dynamic error) {if (error is DioException) {switch (error.type) {case DioExceptionType.connectionTimeout:throw const ApiException(message: '连接超时');case DioExceptionType.sendTimeout:throw const ApiException(message: '请求超时');case DioExceptionType.receiveTimeout:throw const ApiException(message: '响应超时');case DioExceptionType.badResponse:throw ApiException(code: error.response?.statusCode,message: error.response?.statusMessage,);default:throw ApiException(message: error.message);}}throw ApiException(message: error.toString());}
}

2. 缓存拦截器实现

class CacheInterceptor extends Interceptor {final _cache = <String, Response>{};void onRequest(RequestOptions options, RequestInterceptorHandler handler) {// 只缓存GET请求if (options.method == 'GET') {final key = options.uri.toString();final cachedResponse = _cache[key];if (cachedResponse != null) {return handler.resolve(cachedResponse);}}handler.next(options);}void onResponse(Response response, ResponseInterceptorHandler handler) {// 缓存响应数据if (response.requestOptions.method == 'GET') {final key = response.requestOptions.uri.toString();_cache[key] = response;}handler.next(response);}
}

3. 使用示例

// API服务类
class UserService {final _http = HttpClient();Future<User> getUserInfo(String userId) async {final response = await _http.get<Map<String, dynamic>>('/users/$userId',);return User.fromJson(response);}Future<List<User>> getUsers({int page = 1, int size = 20}) async {final response = await _http.get<List<dynamic>>('/users',params: {'page': page, 'size': size},);return response.map((json) => User.fromJson(json)).toList();}Future<void> updateUser(String userId, Map<String, dynamic> data) async {await _http.post<void>('/users/$userId',data: data,);}
}

性能优化建议

  1. 合理使用拦截器

    • 避免在拦截器中进行耗时操作
    • 使用异步操作时注意处理异常
  2. 请求优化

    • 合理设置超时时间
    • 使用cancelToken取消不必要的请求
    • 避免频繁的重复请求
  3. 缓存策略

    • 针对不常变化的数据实现缓存
    • 设置合理的缓存过期时间
    • 考虑使用本地存储持久化缓存
  4. 错误处理

    • 实现统一的错误处理机制
    • 合理使用重试机制
    • 提供友好的错误提示

常见问题解决

  1. 证书验证问题
// 忽略证书验证
dio.options.validateStatus = (status) {return status! < 500;
};// 或者自定义证书验证
(dio.httpClientAdapter as IOHttpClientAdapter).onHttpClientCreate = (HttpClient client) {client.badCertificateCallback =(X509Certificate cert, String host, int port) => true;return client;};
  1. 请求取消后的内存泄漏
// 在dispose时取消所有请求
final _cancelTokens = <CancelToken>[];void addCancelToken(CancelToken token) {_cancelTokens.add(token);
}
void dispose() {for (final token in _cancelTokens) {token.cancel();}_cancelTokens.clear();super.dispose();
}

面试题解析

1. dio与http package的区别是什么?

答:dio相比http package有以下优势:

  • 更强大的功能:支持拦截器、请求取消、文件上传下载进度监听等
  • 更好的扩展性:可以通过拦截器机制实现各种自定义功能
  • 更完善的错误处理:提供了统一的错误处理机制
  • 更方便的配置:支持全局配置和请求级配置
  • 更好的性能:支持请求队列、连接池等优化

2. 如何实现token失效自动刷新?

答:可以通过拦截器实现:

  1. 在响应拦截器中检测token失效(如401状态码)
  2. 调用刷新token的接口获取新token
  3. 使用新token重试原请求
  4. 注意处理并发请求的情况,避免多次刷新token
class TokenInterceptor extends Interceptor {bool _isRefreshing = false;List<RequestOptions> _pendingRequests = [];void onError(DioException err, ErrorInterceptorHandler handler) async {if (err.response?.statusCode == 401) {final options = err.requestOptions;if (!_isRefreshing) {_isRefreshing = true;try {final newToken = await refreshToken();// 更新所有等待的请求for (final request in _pendingRequests) {request.headers['Authorization'] = 'Bearer $newToken';dio.fetch(request);}_pendingRequests.clear();} finally {_isRefreshing = false;}} else {_pendingRequests.add(options);}return;}handler.next(err);}
}

3. dio如何处理大文件上传?

答:处理大文件上传需要注意以下几点:

  1. 使用FormData和MultipartFile处理文件上传
  2. 监听上传进度
  3. 实现断点续传
  4. 处理超时和错误重试
Future<void> uploadLargeFile(String filePath) async {final file = File(filePath);final fileSize = await file.length();// 创建FormDatafinal formData = FormData.fromMap({'file': await MultipartFile.fromFile(filePath,filename: basename(filePath),),});try {await dio.post('/upload',data: formData,options: Options(headers: {Headers.contentLengthHeader: fileSize,},sendTimeout: Duration(minutes: 10),),onSendProgress: (int sent, int total) {final progress = sent / total;print('上传进度:${(progress * 100).toStringAsFixed(2)}%');},);} catch (e) {// 处理错误,实现断点续传逻辑}
}

4. 如何优化dio的性能?

答:可以从以下几个方面优化dio的性能:

  1. 连接池优化

    • 合理设置maxConnectionsPerHost
    • 复用连接
  2. 请求优化

    • 使用适当的超时设置
    • 实现请求合并
    • 避免频繁创建dio实例
  3. 响应优化

    • 实现数据缓存
    • 使用压缩传输
    • 合理处理大量数据
  4. 内存优化

    • 及时释放不需要的资源
    • 避免内存泄漏
// 示例:请求合并优化
class RequestMerger {static final _instance = RequestMerger._();final _pending = <String, Completer<dynamic>>{};factory RequestMerger() => _instance;RequestMerger._();Future<T> request<T>(String url, Future<T> Function() fetcher) async {if (_pending.containsKey(url)) {return _pending[url]!.future as Future<T>;}final completer = Completer<T>();_pending[url] = completer;try {final result = await fetcher();completer.complete(result);return result;} catch (e) {completer.completeError(e);rethrow;} finally {_pending.remove(url);}}
}

总结

dio是一个功能强大且灵活的HTTP客户端库,通过合理的封装和优化,可以构建出一个健壮的网络请求层。本文介绍了dio的基本使用、进阶特性、实战案例和性能优化建议,希望能帮助读者更好地使用dio进行网络开发。

参考资源

  1. dio官方文档:https://pub.dev/packages/dio
  2. Flutter网络请求最佳实践:https://flutter.dev/docs/development/data-and-backend/networking
  3. dio源码:https://github.com/flutterchina/dio

如果你对文章内容有任何疑问或建议,欢迎在评论区留言交流。

相关文章:

常用第三方库:dio网络库使用与封装

常用第三方库&#xff1a;dio网络库使用与封装 前言 dio是Flutter生态中最受欢迎的网络请求库之一&#xff0c;它提供了强大的功能和灵活的配置选项。本文将从实战角度深入介绍dio的使用技巧和最佳实践。 基础知识 1. dio简介 dio是一个强大的Dart Http请求库&#xff0c;…...

解决IntelliJ IDEA配置文件(application.properties)中文注释变成乱码的问题

文章目录 1. 问题呈现2. 问题产生的原因3. 解决方法 更多 IntelliJ IDEA 的使用技巧可查看 IntelliJ IDEA 专栏中的文章&#xff1a;IntelliJ IDEA 1. 问题呈现 在 IntelliJ IDEA 中打开配置文件&#xff08;application.properties&#xff09;时&#xff0c;文件中的中文注…...

linux基础14--dns和web+dns

DNS&#xff1a;域名系统&#xff08;Domain Name System&#xff09; DNS协议是用来将域名转换为IP地址或将IP地址转换为相应的域名 DNS使用TCP和UDP端口53&#xff0c;给用户提供解析时一般使用UDP53 对于每一级域名长度的限制是63个字符&#xff0c;域名总长度则不能超过2…...

Java 静态内部类面试题与高质量答案合集

本文整理了关于 Java 静态内部类&#xff08;Static Nested Class&#xff09;在面试中的高频问题及标准答案&#xff0c;帮助你理解其底层原理、内存表现以及实际应用。 1. 什么是静态内部类&#xff1f;和普通内部类有什么区别&#xff1f; 答&#xff1a; 静态内部类是定义…...

React.cloneElement的用法详解

React.cloneElement的用法详解 React.cloneElement 是 React 提供的一个 API&#xff0c;用于克隆现有的 React 元素&#xff0c;并在克隆的基础上添加或覆盖属性&#xff0c;同时保留原有的子元素。 语法 React.cloneElement(element: ReactElement, props?: Partial<P…...

【数学建模】孤立森林算法:异常检测的高效利器

孤立森林算法&#xff1a;异常检测的高效利器 文章目录 孤立森林算法&#xff1a;异常检测的高效利器1 引言2 孤立森林算法原理2.1 核心思想2.2 算法流程步骤一&#xff1a;构建孤立树(iTree)步骤二&#xff1a;构建孤立森林(iForest)步骤三&#xff1a;计算异常分数 3 代码实现…...

3.1 WPF使用MaterialDesign的介绍1

MaterialDesignInXAML Toolkit 是一个流行的开源 C# WPF 控件库,它实现了 Google 的 Material Design 规范,让开发者可以轻松创建现代化的 WPF 应用程序界面 Material Design 是一个流行的设计语言,由 Google 开发,旨在帮助开发者构建美观且一致的 UI 界面。对于使用 C# 的…...

多路转接select服务器

目录 select函数原型 select服务器 select的缺点 前面介绍过多路转接就是能同时等待多个文件描述符&#xff0c;这篇文章介绍一下多路转接方案中的select的使用 select函数原型 #include <sys/select.h> int select(int nfds, fd_set *readfds, fd_set *writefds, f…...

【算法】BFS-解决FloodFill问题

目录 FloodFill问题 图像渲染 岛屿数量 岛屿的最大面积 被围绕的区域 FloodFill问题 FloodFill就是洪水灌溉的意思&#xff0c;假设有下面的一块田地&#xff0c;负数代表是凹地&#xff0c;正数代表是凸地&#xff0c;数字的大小表示凹或者凸的程度。现在下一场大雨&…...

二叉树层序遍历技术解析与面试指南

文章目录 一、二叉树层序遍历技术解析1. 问题描述2. 层序遍历核心思想3. Java实现代码&#xff08;带详细注释&#xff09;4. 算法关键点解析5. 复杂度分析 二、资深后端面试深度指南1. 高频面试问题集Q1: 如何实现Z字形层序遍历&#xff08;锯齿形遍历&#xff09;&#xff1f…...

软考软件设计师考试情况与大纲概述

文章目录 **一、考试科目与形式****二、考试大纲与核心知识点****科目1&#xff1a;计算机与软件工程知识****科目2&#xff1a;软件设计** **三、备考建议****四、参考资料** 这是一个系列文章的开篇 本文对2025年软考软件设计师考试的大纲及核心内容进行了整理&#xff0c;并…...

一款丰富的工作流自动化平台 | N8N 83.6K ⭐

N8N 介绍 N8N 是一个工作流自动化平台&#xff0c;为技术团队提供代码的灵活性和无代码的速度。n8n 具有 400 集成、原生 AI 功能和公平代码许可证&#xff0c;可让您构建强大的自动化功能&#xff0c;同时保持对数据和部署的完全控制。 &#x1f6a2; 项目地址 Github: https…...

Apache PDFBox

Apache PDFBox 是一个用于处理 PDF 文档的开源 Java 库&#xff0c;由 Apache 软件基金会开发和维护。它提供了丰富的功能&#xff0c;允许开发者在 Java 应用程序中创建、读取、修改和提取 PDF 文件中的信息。以下是关于 PDFBox 的详细介绍&#xff1a; 主要功能 创建 PDF 文…...

如何批量为多个 Word 文档添加水印保护

在日常办公中&#xff0c;Word文档添加水印是一项重要的操作&#xff0c;特别是在需要保护文件内容的安全性和版权时。虽然Office自带了添加水印的功能&#xff0c;但当需要一次性给多个Word文档添加水印时&#xff0c;手动操作显得非常繁琐且低效。为了提高效率&#xff0c;可…...

【MySQL】005.MySQL表的约束(上)

文章目录 表的约束1. 约束概念2. 空属性2.1 基本语法2.2 使用示例 3. 默认值3.1 基本概念3.2 使用示例 4. 列描述4.1 基本概念4.2 使用示例 5. zerofill5.1 基本功能5.2 使用示例5.3 注意事项 6. 主键6.1 基本概念6.2 使用示例 表的约束 1. 约束概念 真正约束字段的是数据类型…...

力扣刷题Day 27:环形链表(141)

1.题目描述 2.思路 创建一个结点集合&#xff0c;遍历链表&#xff0c;如果遇到已经加进集合的结点就说明链表有环。 3.代码&#xff08;Python3&#xff09; class Solution:def hasCycle(self, head: Optional[ListNode]) -> bool:node headnode_set set()while node…...

window上 elasticsearch v9.0 与 jmeter5.6.3版本 冲突,造成es 启动失败

[2025-04-22T11:00:22,508][ERROR][o.e.b.Elasticsearch ] [AIRUY] fatal exception while booting Elasticsearchjava.nio.file.NoSuchFileException: D:\Program Files\apache-jmeter-5.6.3\lib\logkit-2.0.jar 解决方案&#xff1a; 降低 es安装版本 &#xff0c;选择…...

PDF转换Word深度评测 - ComPDFKit Conversion SDK V3.0

ComPDFKit PDF 转换 SDK 在V3.0 中有以下几个新功能: 使用百万级文档训练数据集对 PPYoloE AI 模型进行微调 全场景布局分析算法及下一代表格识别算法 重构数据结构、转换流程、PDF解析和输出模块 混合布局&#xff1a;将流式布局与固定布局相结合&#xff0c;以保持原始布局…...

Laravel 对接阿里云 OSS 说明文档

Laravel 对接阿里云 OSS 说明文档 一、 简介 将 Laravel 应用与阿里云对象存储服务 (OSS) 对接&#xff0c;可以利用 OSS 提供的高可用、高可靠、可扩展的存储能力来管理应用中的文件&#xff0c;例如用户上传的图片、视频、文档等。这有助于减轻应用服务器的存储压力&#x…...

嘻游电玩三端客户端部署实战:PC + Android + iOS 环境全覆盖教程

本篇文章将针对“网狐系列嘻游电玩组件”的三端客户端&#xff08;PC端、安卓端、iOS端&#xff09;进行详细部署实操讲解。文章将以实测部署为核心&#xff0c;提供资源结构说明、平台适配调整、打包配置、常见问题修复&#xff0c;并辅以必要的关键配置代码。 一、客户端资源…...

mockMvc构建web单元测试学习笔记

web应用本来需要依靠tomcat这个环境运行 现在用mockMvc是为了模拟这个web环境&#xff0c;简化测试 什么是mock(模拟) 模拟对象---mock object是以可控方式模拟真实对象行为的假对象&#xff0c;通过模拟输入数据&#xff0c;验证程序达到预期结果 为什么使用mock对象 因为…...

ffmpeg av_buffer_unref的逻辑实现; av_freep 和 av_freep函数的区别

av_buffer_unref 是 FFmpeg 中用于管理引用计数和内存释放的核心函数&#xff0c;其内部实现机制如下&#xff1a; ‌一、核心流程‌ ‌引用计数递减‌ 函数首先对 AVBufferRef 的 buffer->refcount 进行原子递减操作&#xff08;通过 atomic_fetch_add_explicit 等机制保证…...

Flutter IOS 真机 Widget 错误。Widget 安装后系统中没有

错误信息&#xff1a; SendProcessControlEvent:toPid: encountered an error: Error Domaincom.apple.dt.deviceprocesscontrolservice Code8 "Failed to show Widget com.xxx.xxx.ServerStatus error: Error DomainFBSOpenApplicationServiceErrorDomain Code1 "T…...

Jenkins plugin 的用法和示例

今天介绍一下比较常见的Jenkins plugin 的使用方法 1. 通过AWS s3 upload 插件上传文件到AWS S3 存储桶 前提条件&#xff1a; 安装AWS pipeline step插件在Jenkins 中创建credentials&#xff0c;包含access_key_id和secret_key_id创建S3 存储桶 脚本&#xff1a; pipeli…...

利用java语言,怎样开发和利用各种开源库和内部/自定义框架,实现“提取-转换-加载”(ETL)流程的自动化

一、ETL 架构设计的核心要素​ 在企业级数据处理场景中&#xff0c;ETL&#xff08;Extract-Transform-Load&#xff09;流程自动化是数据仓库、数据湖建设的核心环节。基于 Java 生态的技术栈&#xff0c;我们可以构建分层解耦的 ETL 架构&#xff0c;主要包含以下四层结构&am…...

人工智能在PET-CT中的应用方向探析

人工智能(AI)在正电子发射断层扫描-计算机断层扫描(PET-CT)中的应用正逐步改变医学影像诊断的格局,其核心价值体现在提升诊断效率、优化成像质量、促进精准医疗等方面。近年来,随着深度学习、计算机视觉以及多模态数据融合技术的迅猛发展,AI技术在PET-CT全流程中的渗透愈…...

pod 创建私有库指南

步骤 参考&#xff1a;iOS Pod 私有库创建指南-百度开发者中心 下面主要是对参考链接里面的解释&#xff1a; 创建两个仓库&#xff1a; 一个叫podframe.git&#xff0c;用来存放自定义的framework&#xff0c;比如TestPodFrame.framework一个叫podspec.git&#xff0c;用来…...

操作系统之shell实现(下)

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C语言的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更…...

【设计模式】深入解析代理模式(委托模式):代理模式思想、静态模式和动态模式定义与区别、静态代理模式代码实现

代理模式 代理模式&#xff0c;也叫委托模式。 Spring AOP 是基于动态代理来实现 AOP 的 定义 为其他对象提供一种代理 以控制对这个对象的访问。它的作用就是通过提供一个代理类&#xff0c;让我们在调用目标方法的时候&#xff0c;不再是直接对目标方法进行调用&#xff0c;而…...

Element Plus表格组件深度解析:构建高性能企业级数据视图

一、架构设计与核心能力 Element Plus的表格组件&#xff08;el-table&#xff09;基于Vue 3的响应式系统构建&#xff0c;通过声明式配置实现复杂数据渲染。其核心设计理念体现在三个层级&#xff1a; 数据驱动&#xff1a;通过data属性绑定数据源&#xff0c;支持动态更新与…...

Mongodb分布式文件存储数据库

文章目录 一、MongoDB 简介基本信息特点内部组件 二、MongoDB 部署1. 安装依赖2. 解压部署并配置环境变量3. 修改配置文件以及启动服务4.数据库权限管理 三、MongoDB 管理1. 角色权限2. 操作命令用户管理命令常用命令&#xff08;Mongo4.2.8&#xff09;数据库相关用户相关集合…...

UML 通信图对象协作:共享汽车系统交互脉络

目录 一、通信图的定义与特点 二、通信图的构成要素 三、通信图的优势 四、通信图的实践应用 五、以共享汽车系统通信图为例 &#xff08;一&#xff09;参与者及交互起点 &#xff08;二&#xff09;预订环节交互 &#xff08;三&#xff09;支付流程交互 &#xff0…...

安宝特分享|AR智能装备赋能企业效率跃升

AR装备开启智能培训新时代 在智能制造与数字化转型浪潮下&#xff0c;传统培训体系正面临深度重构。安宝特基于工业级AR智能终端打造的培训系统&#xff0c;可助力企业构建智慧培训新生态。 AR技术在不同领域的助力 01远程指导方面 相较于传统视频教学的单向输出模式&#x…...

中间系统-基础

OSI七层模型&#xff0c;TCP/IP四层模型。 在OSI模型中我们将具有报文转发的网络节点叫做IS&#xff0c;即中间系统的意思&#xff0c;类似于TCP/IP模型中的路由器。 在OSI模型中我们将没有路由能力或者转发能力的设备叫做ES&#xff0c;即端系统的意思&#xff0c;类似于TCP/I…...

【Linux】用户权限

shell命令 1. Linux本质上是一个操作系统&#xff0c;但是一般的用户不能直接使用它&#xff0c;而是需要通过外壳程序shell&#xff0c;来与Linux内核进行沟通。 2. shell的简单定义&#xff1a;命令行解释器。主要包含以下作用&#xff1a; 将使用者的命令翻译给核心处理。将…...

晶振详解:原理、作用、种类、应用与选型要点

一、晶振的基本定义 晶振&#xff08;Crystal Oscillator&#xff09; 是利用石英晶体的压电效应产生稳定频率的电子元件&#xff0c;其核心功能是为数字系统提供高精度时钟信号。 核心公式&#xff1a; 串联谐振频率&#xff08;fs&#xff09; 1 / (2π√(L1C1)) &#xff…...

【数字图像处理】立体视觉基础(2)

相机标定 【1】相机标定的概念 相机参数&#xff1a;相机成像的几何模型的参数 相机标定&#xff1a;求解参数的过程 【2】相机标定的作用 &#xff08;1&#xff09;求出相机的内、外参数&#xff0c;以及畸变参数 &#xff08;2&#xff09;校正镜头畸变影响&#xff0c;…...

智能座舱测试内容与步骤

智能座舱的测试步骤通常包括以下环节&#xff1a; 1.测试环境搭建与准备 • 硬件需求分析&#xff1a;准备测试车辆、服务器与工作站、网络设备以及传感器和执行器模拟器等硬件设备。 • 软件需求分析&#xff1a;选择测试管理软件、自动化测试工具、模拟软件和开发调试工具等。…...

每日算法-250422

每日算法 - 250422 1561. 你可以获得的最大硬币数目 题目 思路 贪心 解题过程 根据题意&#xff0c;我们想要获得最大的硬币数目。每次选择时&#xff0c;有三堆硬币&#xff1a;最大的一堆会被 Alice 拿走&#xff0c;最小的一堆会被 Bob 拿走&#xff0c;剩下的一堆&#xf…...

XSS的应用

免责声明&#xff0c;本博客只是用来自身学习记录&#xff0c;不要运用里面的代码去进行违法犯罪行为。 XSS 首先需要知道的是xss误区&#xff0c;就是在不确定是否有XSS的情况下&#xff0c;不应该是直接上攻击payload&#xff0c;例如<script>alert(123)</script&…...

FastAPI WebSocket 聊天应用详细教程

项目简介 这是一个基于 FastAPI 和 WebSocket 实现的实时聊天应用&#xff0c;支持一对一聊天、离线消息存储等功能。 技术栈 后端&#xff1a;FastAPI (Python)前端&#xff1a;HTML、JavaScript、CSS通信&#xff1a;WebSocket认证&#xff1a;简单的 token 认证 项目结构…...

【C语言】动态内存的常见错误

前言&#xff1a; 在上章节中讲解了动态内存的概念和管理的核心函数。 在本章节继续为大家介绍动态内存的常见错误&#xff0c;让大家更好的理解运用。 补充&#xff1a;使用内存函数需要头文件<stdlib.h> 对NULL指针的解引用操作 当使用malloc、calloc或realloc等函…...

Missashe考研日记-day24

Missashe考研日记-day24 1 专业课408 学习时间&#xff1a;2h30min学习内容&#xff1a; 今天把剩下的两个经典同步问题和管程部分的课看了&#xff0c;然后做课后习题。这部分的重点在PV大题&#xff0c;很多很经典&#xff0c;不过第一轮不打算做大题&#xff0c;把选择题做…...

精益数据分析(13/126):洞察数据关系,灵活调整创业方向

精益数据分析&#xff08;13/126&#xff09;&#xff1a;洞察数据关系&#xff0c;灵活调整创业方向 大家好&#xff01;在创业和数据分析的探索之路上&#xff0c;每一次的学习都是成长的宝贵机会。今天&#xff0c;咱们接着深入学习《精益数据分析》&#xff0c;一起探索相…...

常用python爬虫框架介绍

文章目录 前言1. Scrapy2. BeautifulSoup 与 Requests 组合3. Selenium4. PySpider 前言 Python 有许多优秀的爬虫框架&#xff0c;每个框架都有其独特的特点和适用场景。以下为你详细介绍几个常用的 Python 爬虫框架&#xff1a; Python 3.13.2 安装教程&#xff08;附安装包…...

HarmonyOS:网络HTTP数据请求

导读 场景介绍接口说明request接口开发步骤requestInStream接口开发步骤证书锁定预置应用级证书预置证书公钥哈希值JSON配置文件示例 场景介绍 通过HTTP发起一个数据请求&#xff0c;支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法 接口说明 HTTP数据…...

CoinNexus Chain 推出泰利风暴,开启 Web3.0 智能金融元宇宙科技新时代

4月25日&#xff0c;CoinNexusChain 区块链正式推出开创性的“泰利风暴”&#xff08;Terry Storm&#xff09;&#xff0c;再次展现了其前瞻性的视野和非凡的潜力。这标志着 CoinNexusChain 在 Web3.0 创新浪潮中迈出了重要一步。    Terry是一种创新的 RWA 金融激励机制&…...

编译opencv源码使得opencv-python获得gstreamer支持

我个人习惯在miniconda中使用python版本的opencv&#xff0c;使用pip进行安装时&#xff0c;默认的包并不会有gstreamer支持&#xff0c;我尝试过自己编译opencv-python&#xff0c;编出的包有各种各样的问题。最终还是决定自己从opencv仓库源码自行编译。 安装gstreamer apt…...

眼镜眨巴眨巴-一步几个脚印从头设计数字生命2——仙盟创梦IDE

import cv2 import mediapipe as mp import numpy as np import timemp_drawing mp.solutions.drawing_utils mp_face_mesh mp.solutions.face_mesh# 加载图片 image cv2.imread(wlzc.jpg) # image_height, image_width, _ image.shape# 初始化面部网格模型 with mp_face_…...

django之数据的翻页和搜索功能

数据的翻页和搜素功能 目录 1.实现搜素功能 2.实现翻页功能 一、实现搜素功能 我们到bootstrap官网, 点击组件, 然后找到输入框组, 并点击作为额外元素的按钮。 我们需要使用上面红色框里面的组件, 就是搜素组件, 代码部分就是下面红色框框出来的部分。 把这里的代码复制…...