what?ngify 比 axios 更好用,更强大?
文章目录
- 前言
- 一、什么是ngify?
- 二、npm安装
- 三、发起请求
- 3.1 获取 JSON 数据
- 3.2 获取其他类型的数据
- 3.3 改变服务器状态
- 3.4 设置 URL 参数
- 3.5 设置请求标头
- 3.6 与服务器响应事件交互
- 3.7 接收原始进度事件
- 3.8 处理请求失败
- 3.9 Http Observables
- 四、更换 HTTP 请求实现
- 五、XSRF/CSRF 防护
- 六、全局配置
- 七、基本用法
- 八、拦截请求和响应
- 九、测试请求
- 十、支持
前言
这篇文章主要介绍了 @ngify/http
这一响应式 HTTP 客户端,包括其与 axios
的关联、功能特点、基本用法(如获取不同类型数据、设置参数和标头等)、拦截器的使用、更换请求实现、防护机制、全局配置及测试请求等,还对比了它与其他库的差异,强调了其稳定性和便捷性。
一、什么是ngify?
在前端开发中,使用最广泛的 HTTP 客户端为 axios
,它是一个用于浏览器和 Node.js 的、基于 Promise 的 HTTP 客户端。
axios
的前身其实是 AngularJS 的 $http
服务。axios
深受 AngularJS 中提供的 $http
服务的启发,将 $http
服务从 AngularJS 中剥离,提供一个独立的服务,以便在 AngularJS 之外使用。
注:AngularJS 特指 AngularJS v1,而非 Angular 2+。
Angular2+ 抛弃了原有的 $http
服务,转而与 RxJS 深度集成,打造了一个更加先进、现代化的响应式 HTTP 客户端。这个新的客户端充分利用了 RxJS 的强大功能,提供了更灵活、更易于理解的异步操作方式。然而,由于其与 Angular 的依赖注入和 SSR 功能紧密耦合,使得它无法直接应用于 Angular 生态之外。
@ngify/http
是一个基于 RxJS 的响应式 HTTP 客户端,提供了与 Angular HttpClient 高度一致的 API,主要包含以下功能:
- 请求类型化响应对象的能力。
- 简化的错误处理。
- 请求和响应的拦截机制。
- 轻松处理请求超时、重试、并发、缓存等等。
- 支持多种平台:Web、Node.js、微信小程序、uni-app、taro 等等。
@ngify/http
的目标与 axios
一致:提供一个独立的 HTTP 服务,以便在 Angular2+ 之外使用。
💯无需担心 @ngify/http
的稳定性,@ngify/http
采用了与 Angular HttpClient 相同的严格单元测试,确保了其代码质量和可靠性,在各种场景下保持足够的稳定性。
二、npm安装
npm install @ngify/http
三、发起请求
HttpClient
具有与用于发出请求的不同 HTTP
动词相对应的方法,这些方法既可以加载数据,也可以在服务器上应用变更。每个方法都返回一个 RxJS Observable
,订阅后会发送请求,然后在服务器响应时发出结果。
由 HttpClient 创建的 Observable 可以被订阅任意多次,并且每次订阅都会发出一个新的后端请求。
通过传递给请求方法的选项对象,可以调整请求的各种属性和返回的响应类型。
3.1 获取 JSON 数据
从后端获取数据通常需要使用 HttpClient.get()
方法发出 GET
请求。此方法采用两个参数:要从中获取的字符串端点 URL
,以及用于配置请求的可选选项对象。
例如,要使用 HttpClient.get()
方法从假设的 API
获取配置数据:
http.get<Config>('/api/config').subscribe(config => {// process the configuration.
});
请注意泛型类型参数,它指定服务器返回的数据的类型为 Config
。该参数是可选的,如果省略它,则返回的数据将具有 any
类型。
🎯 注意: 如果数据具有未知形状的类型,那么更安全的方法是使用 unknown 作为响应类型。
请求方法的通用类型是关于服务器返回的数据的类型断言。 HttpClient
不会验证实际返回数据是否与该类型匹配。
3.2 获取其他类型的数据
默认情况下, HttpClient
假定服务器将返回 JSON
数据。与非 JSON API 交互时,您可以告诉 HttpClient
在发出请求时期望并返回什么响应类型。这是通过 responseType
选项完成的。
Response type | Returned response type |
---|---|
‘json’ (默认) | 给定泛型类型的 JSON 数据 |
‘text’ | 字符串文本 |
‘blob’ | Blob 实例 |
‘arraybuffer’ | 包含原始响应字节的 ArrayBuffer |
例如,您可以要求 HttpClient 将 .jpeg 图像的原始字节下载到 ArrayBuffer 中:
http.get('/images/dog.jpg', { responseType: 'arraybuffer' }).subscribe(buffer => {console.log('The image is ' + buffer.byteLength + ' bytes large');
});
3.3 改变服务器状态
执行修改的服务器 API
通常需要发出 POST
请求,并在请求正文中指定新状态或要进行的更改。
HttpClient.post()
方法的行为与 get()
类似,只是第二位参数变为 body
参数:
http.post<Config>('/api/config', newConfig).subscribe(config => {console.log('Updated config:', config);
});
可以提供许多不同类型的值作为请求的 body
,并且 HttpClient
将相应地序列化它们:
Body | typeSerialization as |
---|---|
string | 纯文本 |
number、boolean、Array 或 object | JSON 字符串 |
ArrayBuffer | 来自 buffer 的原始数据 |
Blob | 具有 Blob 内容类型的原始数据 |
FormData | multipart/form-data 表单数据 |
HttpParams 或 URLSearchParams | application/x-www-form-urlencoded 格式化字符串 |
3.4 设置 URL 参数
使用 params
选项指定应包含在请求 URL
中的请求参数。
传递字面量对象是配置 URL
参数的最简单方法:
http.get('/api/config', {params: { filter: 'all' },
}).subscribe(config => {// ...
});http.post('/api/config', body, {params: { filter: 'all' },
}).subscribe(config => {// ...
});
或者,如果您需要对参数的构造或序列化进行更多控制,则可以传递 HttpParams
的实例。
🎯注意: HttpParams 的实例是不可变的,不能直接更改。相反,诸如 append() 之类的可变方法会返回应用了变更的 HttpParams 的新实例。
const baseParams = new HttpParams().set('filter', 'all');http.get('/api/config', {params: baseParams.set('details', 'enabled')
}).subscribe(config => {// ...
});http.post('/api/config', body, {params: baseParams.set('details', 'enabled')
}).subscribe(config => {// ...
});
您可以使用自定义 HttpParameterCodec
实例化 HttpParams(构造方法中的第二个参数),该自定义
HttpParameterCodec确定
HttpClient` 如何将参数编码到 URL 中。
3.5 设置请求标头
使用 headers
选项指定应包含在请求中的请求标头。
传递字面量对象是配置请求标头的最简单方法:
http.get('/api/config', {headers: {'X-Debug-Level': 'verbose',}
}).subscribe(config => {// ...
});
或者,如果您需要对标头的构造进行更多控制,请传递 HttpHeaders
的实例。
🎯注意: HttpHeaders 的实例是不可变的,不能直接更改。相反,诸如 append() 之类的可变方法会返回应用了变更的 HttpHeaders 的新实例。
const baseHeaders = new HttpHeaders().set('X-Debug-Level', 'minimal');http.get<Config>('/api/config', {headers: baseHeaders.set('X-Debug-Level', 'verbose'),
}).subscribe(config => {// ...
});
3.6 与服务器响应事件交互
为了方便起见,HttpClient
默认返回服务器返回的数据的 Observable(body)
。有时需要检查实际响应,例如检索特定的响应标头。
要访问整个响应,请将 observe
选项设置为 'response'
:
http.get<Config>('/api/config', { observe: 'response' }).subscribe(res => {console.log('Response status:', res.status);console.log('Body:', res.body);
});
3.7 接收原始进度事件
除了响应正文或响应对象之外,HttpClient
还可以返回与请求生命周期中的特定时刻相对应的原始事件流。这些事件包括何时发送请求、何时返回响应标头以及何时完成正文。这些事件还可以包括报告大型请求或响应正文的上传和下载状态的进度事件。
默认情况下,进度事件处于禁用状态(因为它们会产生性能成本),但可以使用 reportProgress
选项来启用。
🎯注意:
HttpClient
的fetch
实现不支持报告上传进度事件。
要观察事件流,请将 observe
选项设置为 'events'
:
http.post('/api/upload', myData, {reportProgress: true,observe: 'events',
}).subscribe(event => {switch (event.type) {case HttpEventType.UploadProgress:console.log('Uploaded ' + event.loaded + ' out of ' + event.total + ' bytes');break;case HttpEventType.Response:console.log('Finished uploading!');break;}
});
事件流中报告的每个 HttpEvent
都有一个 type
来区分事件所代表的内容:
3.8 处理请求失败
HTTP
请求失败有两种情况:
- 网络或连接错误可能会阻止请求到达后端服务器。
- 后端可以收到请求但无法处理,并返回错误响应。
HttpClient
在 HttpErrorResponse 中捕获这两种错误,并通过 Observable
的错误通道返回该错误。网络错误的 status
代码为 0,error
是 ProgressEvent 的实例。
后端错误具有后端返回的失败 status
代码,以及错误响应 error
。检查响应以确定错误的原因以及处理错误的适当操作。
RxJS 提供了多个可用于错误处理的运算符。
您可以使用 catchError
运算符将错误响应转换为 UI
的值。该值可以告诉 UI
显示错误页面或值,并在必要时捕获错误原因。
有时,诸如网络中断之类的暂时性错误可能会导致请求意外失败,只需重试请求即可使其成功。RxJS
提供了几个重试运算符,它们在某些条件下自动重新订阅失败的 Observable
。例如,retry()
运算符将自动尝试重新订阅指定的次数。
3.9 Http Observables
HttpClient
上的每个请求方法都会构造并返回所请求响应类型的 Observable。使用 HttpClient
时,了解这些 Observable 的工作原理非常重要。
HttpClient
生成 RxJS 所谓的 “冷” Observable,这意味着在订阅 Observable之前不会发生任何实际请求。只有这样,请求才真正发送到服务器。多次订阅同一个 Observable会触发多个后端请求。每个订阅都是独立的。
一旦响应返回,来自 HttpClient
的 Observable通常会自动完成(尽管拦截器会影响这一点)。
由于自动完成,如果不清理 HttpClient
订阅,通常不存在内存泄漏的风险。
四、更换 HTTP 请求实现
@ngify/http
内置了以下 HTTP
请求实现:
HTTP请求实现 | 包 | 描述 |
---|---|---|
withXhr | @ngify/http | 使用 XMLHttpRequest 进行 HTTP 请求 |
withFetch | @ngify/http | 使用 Fetch API 进行 HTTP 请求 |
withWx | @ngify/http-wx | 在 微信小程序 中进行 HTTP 请求 |
withTaro | @ngify/http-taro | 在 Taro 中进行 HTTP 请求 |
withUni | @ngify/http-uni | 在 Uni-app 中进行 HTTP 请求 |
HttpClient
默认使用 withXhr
,您可以自行切换到其他实现:
import { withXhr, withFetch } from '@ngify/http';
import { withWx } from '@ngify/http-wx';const xhrHttp = new HttpClient(withXhr()
);
const fetchHttp = new HttpClient(withFetch()
);
const wxHttp = new HttpClient(withWx()
);
你还可使用自定义的 HttpBackend
实现:
// 需要实现 HttpBackend 接口
class CustomHttpBackend implements HttpBackend {handle(request: HttpRequest<any>): Observable<HttpEvent<any>> {// ...}
}const customHttp = new HttpClient({kind: HttpFeatureKind.Backend,value: new CustomHttpBackend()}
);
五、XSRF/CSRF 防护
HttpClient
支持用于防止 XSRF 攻击的通用机制。执行 HTTP
请求时,拦截器从 cookie
中读取令牌(默认为 XSRF-TOKEN),并将其设置为 HTTP
标头(默认为 X-XSRF-TOKEN)。
由于只有在您的域上运行的代码才能读取 cookie
,因此后端可以确定 HTTP
请求来自您的客户端应用程序而不是攻击者。
要启用 XSRF
防护,请在 HttpClient
实例化时或在 setupHttpClient
中传递 withXsrfProtection()
:
const http = new HttpClient(withXsrfProtection()
);
如果您的后端服务对 XSRF
令牌 cookie
或标头使用不同的名称,请自定义 cookie
名称与标头名称:
withXsrfProtection({cookieName: 'CUSTOM_XSRF_TOKEN',headerName: 'X-Custom-Xsrf-Header',
});
默认情况下,拦截器会在除 GET/HEAD
外的所有请求(例如 POST)上将此标头发送到相对 URL
,但不会在具有绝对 URL
的请求上发送此标头。
为什么不保护 GET 请求?
仅对于可以更改后端状态的请求才需要 CSRF 保护。就其本质而言,CSRF 攻击跨越域边界,并且 Web 的同源策略将阻止攻击页面检索经过身份验证的 GET 请求的结果。
为了利用这一点,您的服务器需要在页面加载或第一个 GET
请求时在名为 XSRF-TOKEN
的 cookie
中设置一个令牌。
在后续请求中,服务器可以验证 cookie
是否与 X-XSRF-TOKEN HTTP
标头匹配,因此确保只有在您的域上运行的代码才能发送请求。
令牌对于每个用户必须是唯一的,并且必须可由服务器验证;这可以防止客户端创建自己的令牌。
HttpClient 仅支持 XSRF 保护方案的客户端部分
您的后端服务必须配置为为您的页面设置 cookie,并验证标头是否存在于所有符合条件的请求中。如果不这样做,HttpClient 的 XSRF 保护就会失效。
六、全局配置
您可以使用 setupHttpClient
函数进行全局配置:
setupHttpClient(withFetch(),withXsrfProtection(),
);
七、基本用法
待续
八、拦截请求和响应
请移步:ngify 拦截请求和响应
九、测试请求
参考 angular.dev/guide/http/…
十、支持
对 @ngify/http 感兴趣?为该项目点星⭐!@ngify/http
相关文章:
what?ngify 比 axios 更好用,更强大?
文章目录 前言一、什么是ngify?二、npm安装三、发起请求3.1 获取 JSON 数据3.2 获取其他类型的数据3.3 改变服务器状态3.4 设置 URL 参数3.5 设置请求标头3.6 与服务器响应事件交互3.7 接收原始进度事件3.8 处理请求失败3.9 Http Observables 四、更换 HTTP 请求实现…...
EFCore HasDefaultValueSql (续2 HasComputedColumnSql)
前情:EFCore HasDefaultValueSql EFCore HasDefaultValueSql (续1 ValueGeneratedOnAdd)-CSDN博客 小伙伴在使用 HasDefaultValueSql 时,对相关的 ValueGeneratedOnAdd, HasComputedColumnSql 也有了疑问: HasComputedColumnSql 对于计算…...
springboot整合h2
在 Spring Boot 中整合 H2 数据库非常简单。H2 是一个轻量级的嵌入式数据库,非常适合开发和测试环境。以下是整合 H2 数据库的步骤: 1. 添加依赖 首先,在你的 pom.xml 文件中添加 H2 数据库的依赖: <dependency><grou…...
Unity自带的真车模拟系统,速度不够大r时如何以匀速上桥
在 Unity 中,如果你使用自带的真车模拟系统(如 Wheel Collider)时,发现车辆上桥时速度不够,导致无法顺利上坡,可以通过以下方法调整车辆的行为,使其能够以匀速上桥: 1. 调整 Wheel C…...
HarmonyOS鸿蒙-@State@Prop装饰器限制条件
一、组件Components级别的状态管理: State组件内状态限制条件 1.State装饰的变量必须初始化,否则编译期会报错。 // 错误写法,编译报错 State count: number;// 正确写法 State count: number 10; 2.嵌套属性的赋值观察不到。 // 嵌套的…...
C# 中的 Task 和 Async/Await
理解 C# 中的 Task 和 Async/Await:提升程序性能的利器 前言:在现代应用程序开发中,特别是在设计用户界面(UI)和进行网络请求等 I/O 操作时,异步编程变得尤为重要。C# 提供了一套强大的异步编程模型&#…...
vue.js 基于VueCli自定义创建项目
在使用Vue.js进行项目开发时,我们可以使用Vue CLI来快速创建项目。Vue CLI是一个基于Vue.js的命令行工具,它提供了一套完整的项目脚手架,可以帮助开发者快速搭建Vue.js项目的开发环境。 下面我们来详细解析如何使用Vue CLI自定义创建项目&am…...
Java中的反射机制及其应用场景
目录 什么是Java反射机制? 工作原理 主要应用场景 注意事项 总结 什么是Java反射机制? Java反射机制是一种强大的工具,它允许程序在运行时访问、检查和修改其本身的类和对象的信息。通过反射,开发者可以在不知道类的具体实现…...
金融项目实战 03|JMeter脚本实现手工接口测试
目录 一、环境说明 1、项目环境搭建 2、Mock说明 二、构造测试数据 1、通过系统页面构造 2、通过接口构造 3、通过数据库构造【推荐】 4、案例:构造借款业务数据 三、JMeter执行接口测试用例 1、获取图片验证码、获取短信验证码 2、注册脚本 3、登录脚本…...
前端工具汇总
1. vscode 下载地址:https://code.visualstudio.com/ vscode扩展汇总: 1.1 Code Spell Checker(必须安装) 代码拼写检查器 1.2 Auto Close Tag 自动添加HTML/XML的关闭标签 3. Auto Import 自动查找、解析并为所有可用导入…...
【学习路线】Python数据分析(数据科学) 详细知识点学习路径(附学习资源)
学习本路线内容之前,请先学习Python的基础知识 其他路线: Python基础 >> Python进阶 >> Python爬虫 >> Python数据分析(数据科学) >> Python 算法(人工智能) >> Pyth…...
Flutter 实现验证码输入框学习
学习flutter代码 实现一个用于输入验证码的自定义组件,它允许用户输入固定长度的验证码,并在输入完成时触发回调。 前置知识点学习 TextStyle TextStyle 是 Flutter 中用于定义文本样式的类。它提供了一组属性来控制文本的外观,如字体大小、…...
hutool糊涂工具通过注解设置excel宽度
import java.lang.annotation.*;Documented Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) public interface ExcelStyle {int width() default 0; }/*** 聊天记录*/ Data public class DialogContentInfo {/**…...
汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图)
汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图) 前面的两篇博文简述了AutoSAR CP分层架构的概念,下面我们来具体到每一层的具体内容进行讲解,每一层的每一个功能块力求用一个总览图,外加一个例子的图给大家进…...
有收到腾讯委托律师事务所向AppStore投诉带有【水印相机】主标题名称App的开发者吗
近期,有多名开发者反馈,收到来自腾讯科技 (深圳) 有限公司委托北京的一家**诚律师事务所卞,写给AppStore的投诉邮件。 邮件内容主要说的是,腾讯注册了【水印相机】这四个字的商标,所以你们这些在AppStore上的app&…...
SpringBoot操作spark处理hdfs文件
SpringBoot操作spark处理hdfs文件 1、导入依赖 <!-- spark依赖--><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>3.2.2</version></dependency><depend…...
Spring Boot中的依赖注入是如何工作
Spring Boot 中的依赖注入(Dependency Injection,简称 DI)是通过 Spring 框架的核心机制——控制反转(Inversion of Control,IOC)容器来实现的。Spring Boot 基于 Spring Framework,在应用中自动…...
算法面试1
简述yolov1的网络架构 YOLOv1网络结构包括24层卷积层用来提取图像的特征,2层全连接层回归得到7730(141420)的张量。 网络结构大概如下:输入的是4484483通道的图像,就是RGB图像,然后用64个卷积核大小是…...
Android车机DIY开发之软件篇(八)单独编译
Android车机DIY开发之软件篇(八)单独编译 1.CarLauncher单独编译 CarLauncher源码位于 packages/apps/Car/Launcher 用Eclipse ADT 谷歌定制版编译而成,.mk .bp编译 Android13目录如下: alientekalientek:~/packages/apps/Car$ ls Calendar …...
保证Mysql数据库到ES的数据一致性的解决方案
文章目录 1.业务场景介绍1.1 需求分析1.2 技术实现方案 2.业界常用数据一致性方案分析2.1 同步双写方案2.2 MQ异步双写方案2.3 扫表定期同步方案2.4 监听binlog同步方案 1.业务场景介绍 1.1 需求分析 某知名的在线旅游平台,在即将到来的春季促销活动之前ÿ…...
Cursor实现go项目配置并实现仓库Gin项目运行
✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 💞当前专栏:知识备份 ✨特色专栏:知识分享 &#x…...
【网络云SRE运维开发】2025第2周-每日【2025/01/11】小测-【第11章NAT理论和实操考试】解析
文章目录 一、选择题二、理论题三、实操题 【网络云SRE运维开发】2025第2周-每日【2025/01/11】小测-【第11章NAT理论和实操考试】解析 一、选择题 在H3C设备上,NAT技术主要用于( ) A. 提高网络安全性 B. 实现不同网段的通信 C. 将内部私有IP…...
drawDB docker部属
docker pull xinsodev/drawdb docker run --name some-drawdb -p 3000:80 -d xinsodev/drawdb浏览器访问:http://192.168.31.135:3000/...
页面顶部导航栏(Navbar)的功能(Navbar/index.vue)
这段代码是一个 Vue.js 组件,实现了页面顶部导航栏(Navbar)的功能。我将分块分析它的各个部分: 模板 (Template): <!-- spid-admin/src/layout/components/Navbar/index.vue --> <template><div class"navb…...
【人工智能】用Python进行对象检测:从OpenCV到YOLO的全面指南
对象检测是计算机视觉领域的核心任务之一,广泛应用于视频监控、自动驾驶、智能安防等多个场景。随着深度学习技术的发展,基于传统方法的对象检测逐渐被基于神经网络的先进模型所取代。本文将系统地介绍如何使用Python进行对象检测,重点探讨了…...
深度学习从入门到实战——卷积神经网络原理解析及其应用
卷积神经网络CNN 卷积神经网络前言卷积神经网络卷积的填充方式卷积原理展示卷积计算量公式卷积核输出的大小计算感受野池化自适应均值化空洞卷积经典卷积神经网络参考 卷积神经网络 前言 为什么要使用卷积神经网络呢? 首先传统的MLP的有什么问题呢? - …...
Flink概念知识讲解之:Restart重启策略配置
Flink概念知识讲解之:Restart重启策略配置 当 Task 发生故障时,Flink 需要重启出错的 Task 以及其他受到影响的 Task ,以使得作业恢复到正常执行状态。 Flink 通过重启策略和故障恢复策略来控制 Task 重启:重启策略决定是否可以…...
Golang中使用 Mqtt
MQTT 是一种基于发布/订阅模式的 轻量级物联网消息传输协议 ,可以用极少的代码和带宽为联网设备提供实时可靠的消息服务,它广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等行业。 本文主要介绍如何在 Golang 项目中使用 github.com/eclips…...
腾讯云下架印度云服务器节点,印度云服务器租用何去何从
近日,腾讯云下架印度云服务器节点的消息引起了业界的广泛关注。这一变动让许多依赖印度云服务器的用户开始担忧,印度云服务器租用的未来究竟在何方? 从印度市场本身来看,其云服务市场的潜力不容小觑。据 IDC 报告,到 2…...
STM32内置Flash
一、原理 利用flash存储用户数据需要注意查看,用户数据是否会覆盖芯片运行程序。 IAP(在程序中编程)利用程序修改程序本身,和OTA是一个原理。IAP在程序中编程支持任意一种通信下载。 ICP(在电路中编程,通…...
面试:C++类成员初始化顺序
1、非静态数据成员:按它们在类定义的声明顺序初始化,不会按它们在初始化列表的顺序。 2、静态数据成员:在main函数启动之前,并且只初始化一次 3、基类构造函数:如果类从一个或多个基类继承而来,基类的构造…...
约束的笔记
约束的分类 为什么需要约束 为了保证数据的完整性 ①实体完整性(Entity Integrity)(同一个表中,不能存在两条完全相同无法区分的记录) ②域完整性(Domain Integrity) ③引用完整性(Referential Integ…...
【Docker】安装registry本地镜像库,开启Https功能
下载镜像 docker pull registry:2 需要启动https功能,就要生成服务端的自签名的证书和私钥,以及在docker客户端安装这个经过签名的证书。 第一步:生成公私钥信息,第二步,制作证书签名申请文件, 第三步&…...
el-tree拖拽光标错位问题
背景:el-tree实现的分类树增加拖拽功能后,当分类树由于数量较多产生滚动条,如果分类树已滚动,进行拖拽时会造成光标错位的问题: 原因:el-tree拖拽光标定位的高度并未加上滚动的高度解决:将滚动的样式属性放…...
Linux权限
目录 一.Linux权限的概念 二.Linux权限管理 1.文件访问者的分类 2.文件类型和访问权限 1.文件类型 2.基本权限 3.文件权限的表示方法 1.字符表示法 2.八进制表示法 4.文件权限的相关访问方法 1.chmod 2.chown 3.chgrp 4.粘滞位 三.权限总结 一.Linux权限的概念 …...
mysql binlog 日志分析查找
文章目录 前言一、分析 binlog 内容二、编写脚本结果总结 前言 高效快捷分析 mysql binlog 日志文件。 mysql binlog 文件很大 怎么快速通过关键字查找内容 一、分析 binlog 内容 通过 mysqlbinlog 命令可以看到 binlog 解析之后的大概样子 二、编写脚本 编写脚本 search_…...
win32汇编环境,窗口程序中对按钮控件常用操作的示例
;运行效果 ;win32汇编环境,窗口程序中对按钮控件常用操作的示例 ;常用的操作,例如创建按钮控件,使其无效,改变文本,得到文本等。 ;将代码复制进radasm软件里,直接就可以编译运行。重点部分加备注。 ;>&g…...
风水算命系统架构与功能分析
系统架构 服务端:Java(最低JDK1.8,支持JDK11以及JDK17)数据库:MySQL数据库(标配5.7版本,支持MySQL8)ORM框架:Mybatis(集成通用tk-mapper,支持myb…...
如何在 Ubuntu 22.04 上安装和配置邮件服务器教程
简介: 在本指南中,我们将演示如何在 Ubuntu 22.04 上安装和配置邮件服务器,因为大中型公司可以从拥有私人邮件服务器中获益匪浅。通过使用邮件服务器,可以密切监视所有电子邮件流量。此外,自定义设置的灵活性使得建立…...
后门原理与实践
实验目录 windows主机与kali虚拟机实现互联互通使用netcat获取主机操作Shell,cron启动使用socat获取主机操作Shell, 任务计划启动使用MSF meterpreter生成可执行文件,利用ncat或socat传送到主机并运行获取主机Shell使用MSF meterpreter生成获取目标主机…...
代理模式详解与应用
代理模式(Proxy Pattern),也称为委托模式或 surrogate 模式,是一种结构型设计模式。它为其他对象提供一个代理以控制对这个对象的访问。通过引入代理对象,可以在不改变原始对象接口的前提下,添加额外的功能…...
C#,动态规划问题中基于单词搜索树(Trie Tree)的单词断句分词( Word Breaker)算法与源代码
1 分词 分词是自然语言处理的基础,分词准确度直接决定了后面的词性标注、句法分析、词向量以及文本分析的质量。英文语句使用空格将单词进行分隔,除了某些特定词,如how many,New York等外,大部分情况下不需要考虑分词…...
基于单片机的智能家居排气扇系统设计
1系统方案设计 本设计基于单片机的智能家居排气扇系统采用STM32单片机作为主控制器,通过DHT11温湿传感器和MQ-2烟雾传感器实现温度、湿度、烟雾检测,在自动模式下,可以根据烟雾浓度通过PWM调速的方式自动调节排气扇的速度,而在手…...
基于JAVA+SpringBoot+Vue的二手车交易系统
基于JAVASpringBootVue的二手车交易系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 哈喽…...
【JVM-2.2】使用JConsole监控和管理Java应用程序:从入门到精通
在Java应用程序的开发和运维过程中,监控和管理应用程序的性能和资源使用情况是非常重要的。JConsole是Java Development Kit(JDK)自带的一款图形化监控工具,它可以帮助开发者实时监控Java应用程序的内存、线程、类加载以及垃圾回收…...
windows及linux 安装 Yarn 4.x 版本
1. 确保系统环境准备 a. 安装 Node.js Yarn 依赖于 Node.js,所以需要先安装 Node.js。前往 Node.js 官网 下载并安装适合你的 Windows 版本的 Node.js(推荐 LTS 版本)。安装完成后,打开命令提示符(CMD)或 PowerShell,验证安装:node -v npm -v如果显示版本号,则表示安…...
VS2015 + OpenCV + OnnxRuntime-Cpp + YOLOv8 部署
近期有个工作需求是进行 YOLOv8 模型的 C 部署,部署环境如下 系统:WindowsIDE:VS2015语言:COpenCV 4.5.0OnnxRuntime 1.15.1 0. 预训练模型保存为 .onnx 格式 假设已经有使用 ultralytics 库训练并保存为 .pt 格式的 YOLOv8 模型…...
1.两数之和--力扣
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 示例 1…...
MySQL库表的操作
目录 一、库的操作 1.1库的创建 1.2字符集和校验规则 1.2.1 查看系统默认字符集以及校验规则 1.2.2 查看数据库支持的字符集 1.2.3 查看数据库支持的字符集校验规则 1.2.4 校验规则对数据库的影响 1.3操纵数据库 1.3.1显示库 1.3.2显示创建语句 1.3.3修改数据库 1.3…...
【强化学习】深度确定性策略梯度算法(DDPG)详解(附代码)
📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅…...