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

Android第六次面试总结(okhttp篇)

OkHttp 是一个高效的 HTTP 客户端,它的工作流程包含多个步骤,从请求的创建、发送,到服务器响应的接收和处理,每个环节都有特定的逻辑和组件参与。以下是对 OkHttp 工作流程的详细说明:

1. 请求构建

在使用 OkHttp 发起 HTTP 请求之前,需要先构建一个 Request 对象,这个对象包含了请求的所有必要信息,如请求的 URL、请求方法(GET、POST 等)、请求头和请求体等。可以使用 Request.Builder 来构建 Request 对象,示例代码如下:

import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.MediaType;// 定义请求体的媒体类型
MediaType JSON = MediaType.get("application/json; charset=utf-8");
// 创建请求体
RequestBody body = RequestBody.create(JSON, "{\"name\":\"John\",\"age\":30}");// 构建请求
Request request = new Request.Builder().url("https://example.com/api").post(body).build();

2. 客户端配置

创建一个 OkHttpClient 对象,它是 OkHttp 的核心客户端,用于管理请求的发送和接收。可以使用 OkHttpClient.Builder 来配置客户端的各种参数,例如连接超时时间、读取超时时间、缓存设置、拦截器等,示例代码如下:

import okhttp3.OkHttpClient;
import java.util.concurrent.TimeUnit;// 构建 OkHttpClient
OkHttpClient client = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).writeTimeout(30, TimeUnit.SECONDS).build();

3. 生成 Call 对象

将构建好的 Request 对象传入 OkHttpClient 的 newCall 方法中,会得到一个 Call 对象。Call 对象代表一个已经准备好执行的请求,它有两种执行方式:同步执行和异步执行。示例代码如下:

import okhttp3.Call;// 创建 Call 对象
Call call = client.newCall(request);

4. 执行请求

同步请求

调用 Call 对象的 execute 方法可以发起同步请求,该方法会阻塞当前线程,直到请求完成并返回响应。示例代码如下:

import okhttp3.Response;
import java.io.IOException;try {Response response = call.execute();if (response.isSuccessful()) {String responseData = response.body().string();System.out.println(responseData);}
} catch (IOException e) {e.printStackTrace();
}
异步请求

调用 Call 对象的 enqueue 方法可以发起异步请求,该方法会将请求任务放入线程池中执行,不会阻塞当前线程。当请求完成后,会通过回调方法返回响应结果。示例代码如下:

import okhttp3.Callback;
import okhttp3.Response;
import java.io.IOException;call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {e.printStackTrace();}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {String responseData = response.body().string();System.out.println(responseData);}}
});

 

OkHttp 的缓存机制是其重要特性之一,它基于 HTTP 缓存协议实现,能够有效减少网络请求,提升应用性能、降低数据消耗。以下将从缓存原理、缓存配置、缓存策略、缓存验证以及缓存清理等方面详细介绍。

缓存原理

OkHttp 的缓存机制遵循 HTTP 缓存协议(如 Cache-ControlETagLast-Modified 等)。当发起一个请求时,CacheInterceptor 拦截器会先检查本地缓存中是否存在符合条件的响应。若存在且未过期,就直接使用缓存响应,避免发起网络请求;若缓存不存在或已过期,则发起网络请求,并根据响应的缓存策略将响应结果缓存起来。

缓存配置

要使用 OkHttp 的缓存功能,需要在创建 OkHttpClient 时配置缓存目录和缓存大小。以下是示例代码:

 

import okhttp3.Cache;
import okhttp3.OkHttpClient;
import java.io.File;// 指定缓存目录
File cacheDirectory = new File(getApplicationContext().getCacheDir(), "http_cache");
// 设置缓存大小为 10MB
int cacheSize = 10 * 1024 * 1024; 
Cache cache = new Cache(cacheDirectory, cacheSize);// 构建带有缓存的 OkHttpClient
OkHttpClient client = new OkHttpClient.Builder().cache(cache).build();

缓存策略

缓存策略主要通过 Cache-Control 请求头和响应头来控制,以下是常见的缓存策略:

1. 强制使用缓存

在请求头中设置 Cache-Control: only-if-cached,表示只使用缓存,不发起网络请求。若缓存不存在或已过期,请求会失败。示例代码如下:

import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;Request request = new Request.Builder().url("https://example.com/api").header("Cache-Control", "only-if-cached").build();try {Response response = client.newCall(request).execute();if (response.isSuccessful()) {// 处理响应}
} catch (IOException e) {e.printStackTrace();
}
2. 忽略缓存

在请求头中设置 Cache-Control: no-cache 或 Cache-Control: max-age=0,表示忽略缓存,直接发起网络请求。示例代码如下:

Request request = new Request.Builder().url("https://example.com/api").header("Cache-Control", "no-cache").build();
3. 根据缓存有效期使用缓存

响应头中的 Cache-Control 字段可以设置缓存的有效期,如 Cache-Control: max-age=3600 表示缓存有效期为 1 小时。在有效期内,再次请求相同资源时会使用缓存响应。

缓存验证

当缓存存在但不确定是否过期时,OkHttp 会使用 ETag 或 Last-Modified 进行缓存验证。

1. ETag

ETag 是服务器为资源生成的一个唯一标识符,当资源发生变化时,ETag 也会发生变化。在请求时,OkHttp 会将缓存中的 ETag 添加到请求头的 If-None-Match 字段中发送给服务器。服务器会比较请求中的 ETag 和当前资源的 ETag,如果相同,则返回 304 状态码,表示资源未修改,OkHttp 可以使用缓存响应;如果不同,则返回新的资源和新的 ETag

2. Last-Modified

Last-Modified 是服务器记录资源最后修改的时间。在请求时,OkHttp 会将缓存中的 Last-Modified 添加到请求头的 If-Modified-Since 字段中发送给服务器。服务器会比较请求中的 Last-Modified 和当前资源的最后修改时间,如果请求中的时间早于或等于当前资源的最后修改时间,则返回 304 状态码;否则返回新的资源和新的 Last-Modified

缓存清理和过期处理

OkHttp 使用 DiskLruCache 来管理本地缓存文件,它会自动处理缓存的清理和过期。

1. 缓存空间清理

当缓存空间达到上限时,DiskLruCache 会根据 LRU(Least Recently Used)算法删除最近最少使用的缓存项,以释放空间。

2. 缓存过期处理

当缓存项的有效期过期时,OkHttp 会将其标记为无效,下次请求时会重新发起网络请求。

总结

OkHttp 的缓存机制通过遵循 HTTP 缓存协议,结合 CacheInterceptor 拦截器和 DiskLruCache 来实现高效的缓存管理。合理配置缓存策略和验证机制,可以有效减少网络请求,提升应用性能和用户体验。

深入理解 OkHttp 拦截器

1. 拦截器接口详解

Interceptor 接口是自定义拦截器的基础,它仅包含一个抽象方法 intercept。以下是对该方法参数和返回值的详细解释:

 

import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;public class CustomInterceptor implements Interceptor {@Overridepublic Response intercept(Chain chain) throws IOException {// chain 包含了当前请求的所有信息以及后续拦截器的处理逻辑Request originalRequest = chain.request(); // 可以对原始请求进行修改,例如添加请求头、修改请求方法等Request modifiedRequest = originalRequest.newBuilder().header("Custom-Header", "Custom-Value").build();// proceed 方法会将修改后的请求传递给下一个拦截器,并返回响应Response response = chain.proceed(modifiedRequest);// 可以对响应进行处理,例如添加自定义响应头、解析响应体等return response.newBuilder().header("Custom-Response-Header", "Custom-Response-Value").build();}
}
  • Chain 参数Chain 是一个接口,它代表了整个拦截器链。chain.request() 方法可以获取当前的请求对象;chain.proceed(request) 方法会将请求传递给下一个拦截器,并返回响应。
  • Response 返回值intercept 方法必须返回一个 Response 对象,这个对象可以是原始响应,也可以是经过修改后的响应。
2. 应用拦截器和网络拦截器的区别
应用拦截器
  • 添加方式:通过 OkHttpClient.Builder().addInterceptor(Interceptor interceptor) 方法添加。
  • 执行时机:在所有网络相关操作之前执行,仅处理应用层发起的原始请求。
  • 特点
    • 不会受到重定向、重试等网络操作的影响,每个请求只会经过应用拦截器一次。
    • 可以获取到最原始的请求和最终的响应,适合进行日志记录、请求头添加等操作。
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;public class ApplicationInterceptorExample {public static void main(String[] args) throws IOException {CustomInterceptor customInterceptor = new CustomInterceptor();OkHttpClient client = new OkHttpClient.Builder().addInterceptor(customInterceptor).build();Request request = new Request.Builder().url("https://example.com").build();Response response = client.newCall(request).execute();System.out.println(response.body().string());}
}
网络拦截器
  • 添加方式:通过 OkHttpClient.Builder().addNetworkInterceptor(Interceptor interceptor) 方法添加。
  • 执行时机:在建立网络连接之后、发送请求到服务器之前执行,会处理所有的网络请求,包括重定向和重试的请求。
  • 特点
    • 可以处理网络层的细节,例如请求的重试、重定向等。
    • 可能会执行多次,因为重定向和重试会导致请求多次经过网络拦截器。

 

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;public class NetworkInterceptorExample {public static void main(String[] args) throws IOException {CustomInterceptor customInterceptor = new CustomInterceptor();OkHttpClient client = new OkHttpClient.Builder().addNetworkInterceptor(customInterceptor).build();Request request = new Request.Builder().url("https://example.com").build();Response response = client.newCall(request).execute();System.out.println(response.body().string());}
}

 

3. 拦截器链的详细执行流程
整体流程

OkHttp 的拦截器链是一个有序的拦截器集合,请求和响应会依次经过每个拦截器。拦截器链的执行顺序是固定的,如下所示:

  1. 应用拦截器:按照添加的顺序依次执行。
  2. RetryAndFollowUpInterceptor:负责处理请求的重试和重定向逻辑。如果请求失败,会根据一定的规则进行重试;如果服务器返回重定向响应,会自动发起新的请求到重定向的 URL。
  3. BridgeInterceptor:将用户构建的请求转换为适合网络传输的请求,添加必要的请求头,如 Content-TypeContent-LengthUser-Agent 等。
  4. CacheInterceptor:处理缓存逻辑,根据请求的 Cache-Control 头和缓存中的响应信息判断是否可以使用缓存。如果缓存有效,则直接返回缓存响应;否则发起网络请求,并将响应结果缓存起来。
  5. ConnectInterceptor:负责建立与服务器的连接,根据请求的 URL 确定服务器的地址和端口,然后建立 TCP 连接(如果是 HTTP/2 协议,还会建立 HTTP/2 连接)。
  6. 网络拦截器:按照添加的顺序依次执行。
  7. CallServerInterceptor:负责向服务器发送请求并接收响应,将请求的内容(如请求头、请求体)发送到服务器,然后读取服务器返回的响应头和响应体。
示例代码说明
import okhttp3.*;
import java.io.IOException;public class InterceptorChainExample {public static void main(String[] args) throws IOException {// 应用拦截器Interceptor appInterceptor = chain -> {Request request = chain.request();System.out.println("App Interceptor: Request URL - " + request.url());Response response = chain.proceed(request);System.out.println("App Interceptor: Response Code - " + response.code());return response;};// 网络拦截器Interceptor networkInterceptor = chain -> {Request request = chain.request();System.out.println("Network Interceptor: Request URL - " + request.url());Response response = chain.proceed(request);System.out.println("Network Interceptor: Response Code - " + response.code());return response;};OkHttpClient client = new OkHttpClient.Builder().addInterceptor(appInterceptor).addNetworkInterceptor(networkInterceptor).build();Request request = new Request.Builder().url("https://example.com").build();Response response = client.newCall(request).execute();System.out.println(response.body().string());}
}

在上述代码中,请求会先经过应用拦截器,然后依次经过 RetryAndFollowUpInterceptorBridgeInterceptorCacheInterceptorConnectInterceptor,接着经过网络拦截器,最后由 CallServerInterceptor 发送请求并接收响应。响应会按照相反的顺序再次经过拦截器链。

4. 拦截器的高级应用场景
缓存控制拦截器

可以创建一个拦截器来动态控制缓存策略,例如根据网络状态或用户设置来决定是否使用缓存。

 

import okhttp3.*;
import java.io.IOException;public class CacheControlInterceptor implements Interceptor {@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();if (isNetworkAvailable()) {// 网络可用时,设置缓存策略为最多缓存 60 秒request = request.newBuilder().header("Cache-Control", "max-age=60").build();} else {// 网络不可用时,强制使用缓存request = request.newBuilder().header("Cache-Control", "only-if-cached").build();}return chain.proceed(request);}private boolean isNetworkAvailable() {// 实现网络状态检查逻辑return true;}
}
超时重试拦截器

可以创建一个拦截器来处理请求超时的情况,当请求超时时,自动重试一定次数。

import okhttp3.*;
import java.io.IOException;public class RetryInterceptor implements Interceptor {private static final int MAX_RETRIES = 3;@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();Response response = null;IOException exception = null;for (int i = 0; i < MAX_RETRIES; i++) {try {response = chain.proceed(request);if (response.isSuccessful()) {break;}} catch (IOException e) {exception = e;}}if (response == null) {throw exception;}return response;}
}

总结

   OkHttp 的拦截器机制提供了强大的扩展性和灵活性,通过合理使用应用拦截器和网络拦截器,可以实现日志记录、请求头添加、缓存控制、错误处理等多种功能。深入理解拦截器链的执行流程和不同拦截器的特点,有助于更好地利用拦截器来优化网络请求。

感谢观看!!!

相关文章:

Android第六次面试总结(okhttp篇)

OkHttp 是一个高效的 HTTP 客户端&#xff0c;它的工作流程包含多个步骤&#xff0c;从请求的创建、发送&#xff0c;到服务器响应的接收和处理&#xff0c;每个环节都有特定的逻辑和组件参与。以下是对 OkHttp 工作流程的详细说明&#xff1a; 1. 请求构建 在使用 OkHttp 发…...

ngx_http_escape_location_name

定义在 src\http\ngx_http.c static ngx_int_t ngx_http_escape_location_name(ngx_conf_t *cf, ngx_http_core_loc_conf_t *clcf) {u_char *p;size_t len;uintptr_t escape;escape 2 * ngx_escape_uri(NULL, clcf->name.data, clcf->name.len,NGX_ESCAPE_U…...

QT网络通信的接口与使用

文章目录 前言1.服务端实现流程1.1步骤 1&#xff1a;创建 QTcpServer 并监听端口1.2步骤 2&#xff1a;处理新连接请求1.3步骤 3&#xff1a;接收客户端数据1.4步骤 4&#xff1a;处理客户端断开 2.客户端实现流程2.1步骤 1&#xff1a;创建 QTcpSocket 并连接服务器2.2步骤 2…...

基于生成对抗网络(GAN)的图像超分辨率重建:技术与应用

图像超分辨率重建(Super-Resolution, SR)是计算机视觉领域的重要任务,旨在从低分辨率图像中恢复出高分辨率图像。这一技术在医学影像、卫星图像、视频增强等领域具有广泛的应用价值。传统的超分辨率方法依赖于插值或基于模型的重建,效果有限。近年来,生成对抗网络(GAN)通…...

【spring对bean Request和Session的管理流程】

在 Spring 框架中&#xff0c;除了常见的 单例&#xff08;Singleton&#xff09; 和 原型&#xff08;Prototype&#xff09; 作用域外&#xff0c;还支持 Request 和 Session 作用域。这两种作用域主要用于 Web 应用程序中&#xff0c;分别表示 Bean 的生命周期与 HTTP 请求或…...

FastGPT原理分析-数据集创建第二步:处理任务的执行

概述 文章《FastGPT原理分析-数据集创建第一步》已经分析了数据集创建的第一步&#xff1a;文件上传和预处理的实现逻辑。本文介绍文件上传后&#xff0c;数据处理任务的具体实现逻辑。 数据集创建总体实现步骤 从上文可知数据集创建总体上来说分为两大步骤&#xff1a; &a…...

AI重构SEO关键词优化路径

内容概要 人工智能技术的深度应用正在推动SEO优化进入全新阶段。传统关键词优化依赖人工经验与静态规则&#xff0c;存在效率瓶颈与策略滞后性缺陷。AI技术通过智能语义分析系统&#xff0c;能够穿透表层词汇限制&#xff0c;精准捕捉用户搜索意图的语义关联网络&#xff0c;结…...

VMWare Ubuntu 详细安装教程

VMWare Ubuntu 详细安装教程 一、下载安装VMware二、下载 Ubuntu 镜像文件三、安装 Ubuntu四、开启虚拟机 一、下载安装VMware 官网下载地址https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion知乎大佬的博客原文&#xff0c;含下载地址https://zhua…...

SystemVerilog 数据类型

1、内建数据类型 verilog有两种基本的数据类型&#xff1a;变量和线网&#xff0c;他们各自都可以有四种取值&#xff1a;0 1 z x&#xff1b; RTL代码使用 变量 来存放组合和时序值&#xff1b;变量可以是单bit或者是多bit的无符号数 reg [7:0] m&#xff0c; 32bit的有符号…...

C语言:扫雷

在编程的世界里&#xff0c;扫雷游戏是一个经典的实践项目。它不仅能帮助我们巩固编程知识&#xff0c;还能锻炼逻辑思维和解决问题的能力。今天&#xff0c;就让我们一起用 C 语言来实现这个有趣的游戏&#xff0c;并且通过图文并茂的方式&#xff0c;让每一步都清晰易懂 1. 游…...

特殊行车记录仪DAT视频丢失的恢复方法

行车记录仪是一种常见的车载记录仪&#xff0c;和常见的“小巧玲珑”的行车记录仪不同&#xff0c;一些特种车辆使用的记录仪的外观可以用“笨重”来形容。下边我们来看看特种车载行车记录仪删除文件后的恢复方法。 故障存储: 120GB存储设备/文件系统:exFAT /簇大小:128KB 故…...

_DISPATCHER_HEADER结构中的WaitListHead和_KWAIT_BLOCK的关系

第一部分&#xff1a; // // Wait block // // begin_ntddk begin_wdm begin_nthal begin_ntifs begin_ntosp typedef struct _KWAIT_BLOCK { LIST_ENTRY WaitListEntry; struct _KTHREAD *RESTRICTED_POINTER Thread; PVOID Object; struct _KWAIT_BLOCK *R…...

智能汽车图像及视频处理方案,支持视频实时拍摄特效能力

在智能汽车日新月异的今天&#xff0c;美摄科技作为智能汽车图像及视频处理领域的先行者&#xff0c;凭借其卓越的技术实力和前瞻性的设计理念&#xff0c;为全球智能汽车制造商带来了一场视觉盛宴的革新。美摄科技推出智能汽车图像及视频处理方案&#xff0c;一个集高效性、智…...

Rust + 时序数据库 TDengine:打造高性能时序数据处理利器

引言&#xff1a;为什么选择 TDengine 与 Rust&#xff1f; TDengine 是一款专为物联网、车联网、工业互联网等时序数据场景优化设计的开源时序数据库&#xff0c;支持高并发写入、高效查询及流式计算&#xff0c;通过“一个数据采集点一张表”与“超级表”的概念显著提升性能…...

Android Audio基础(13)——audiomixer

在 Android 平台上&#xff0c;音频混合器 AudioMixer 主要用在 AudioFlinger 里&#xff0c;将多路音频源数据混音&#xff08;包括混音、音量处理、重采样及处理声道等&#xff09;。位于 framework 的音频处理模库 libaudioprocessing&#xff08;frameworks/av/media/libau…...

vivo 湖仓架构的性能提升之旅

作者&#xff1a;郭小龙 vivo互联网 大数据高级研发工程师 导读&#xff1a;本文整理自 vivo互联网 大数据高级研发工程师 郭小龙 在 StarRocks 年度峰会上的分享&#xff0c;聚焦 vivo 大数据多维分析面临的挑战、StarRocks 落地方案及应用收益。 在 即席分析 场景&#xff0c…...

常见中间件漏洞攻略-Tomcat篇

一、 CVE-2017-12615-Tomcat put方法任意文件写入漏洞 第一步&#xff1a;开启靶场 第二步&#xff1a;在首页抓取数据包&#xff0c;并发送到重放器 第三步&#xff1a;先上传尝试一个1.txt进行测试 第四步&#xff1a;上传后门程序 第五步&#xff1a;使用哥斯拉连接 二、后…...

基于linuxC结合epoll + TCP 服务器客户端 + 数据库实现一个注册登录功能

1. 整体功能概述 实现了一个简单的用户注册和登录系统&#xff0c;采用客户端 - 服务器&#xff08;C/S&#xff09;架构。 客户端可以选择注册或登录操作&#xff0c;将用户名和密码发送给服务器&#xff0c;服务器接收请求后处理并返回相应的结果给客户端。 服务器使用 SQLit…...

redis7.4.2单机配置

解压源码包 将从官网下载的redis源码压缩包上传到服务器的相关目录下。 [roothcss-ecs-2851 ~]# cd /opt/soft/redis/ [roothcss-ecs-2851 redis]# ls redis-stable.tar.gz解压并进入解压后的目录中。 [roothcss-ecs-2851 redis]# tar -zxvf redis-stable.tar.gz [roothcss-…...

Unity代码热更新和资源热更新

知识点来源&#xff1a;人间自有韬哥在&#xff0c;hybridclr,豆包 目录 一、代码热更新1.代码热更新概述2.HybridCLR 二、资源热更新1.资源热更新概述2.AB包2.1.AB包的加载2.2.卸载AB包2.3.加载AB包依赖包2.4.获取MD52.5.生成对比文件2.6.更新AB包 3.Addressable3.1.AssetRef…...

【MySQL篇】DEPENDENT SUBQUERY(依赖性子查询)优化:从百秒到秒级响应的四种优化办法

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;从事IT领域✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(…...

腾讯四面面经

说明 是的&#xff0c;没听错&#xff0c;确实是腾讯四面&#xff0c;而且是技术面。先声明下&#xff0c;这个面经是帮朋友整理的&#xff0c;都是真实的面经&#xff0c;不得不说&#xff0c;四面确实是有强的的&#xff0c;接下来让我们一起看下 面试部门&#xff1a;s3&a…...

【mysql】唯一性约束unique

文章目录 唯一性约束 1. 作用2. 关键字3. 特点4. 添加唯一约束5. 关于复合唯一约束 唯一性约束 1. 作用 用来限制某个字段/某列的值不能重复。 2. 关键字 UNIQUE3. 特点 同一个表可以有多个唯一约束。唯一约束可以是某一个列的值唯一&#xff0c;也可以多个列组合的值唯…...

如何理解前端工程化

前端工程化详解 一、 定义二、特点1. 模块化‌2. 组件化‌3. 自动化4. 规范化‌ 三、涉及环节1. 项目架构‌2. 版本控制&#xff1a;3.自动化构建4.任务自动化5. 部署与CI/CD‌ 五、 前端工程化的实际应用六、前端工程化的优势:七、总结‌ 一、 定义 前端工程化是指将前端开发…...

嵌入式八股RTOS与Linux---进程间的通信与同步篇

前言 同步异步、阻塞/非阻塞是什么? 同步:在执行某个操作时&#xff0c;调用者必须等待该操作完成并返回结果后&#xff0c;才能继续执行后续的操作异步:在执行某个操作时&#xff0c;调用者发起操作后不必等待其完成&#xff0c;可以立即继续执行后续的操作。操作完成后&am…...

this.centerDialogVisible = true this.$nextTick(()=>{ this.resetForm(); })

这段代码的作用是 打开一个对话框&#xff0c;并在对话框打开后 重置表单。下面是对这段代码的详细解析&#xff1a; 1. 代码作用 this.centerDialogVisible true&#xff1a;控制对话框的显示。this.$nextTick(() > { ... })&#xff1a;在 DOM 更新后执行回调函数&#…...

datawhale组队学习--大语言模型—task4:Transformer架构及详细配置

第五章 模型架构 在前述章节中已经对预训练数据的准备流程&#xff08;第 4 章&#xff09;进行了介绍。本章主 要讨论大语言模型的模型架构选择&#xff0c;主要围绕 Transformer 模型&#xff08;第 5.1 节&#xff09;、详细 配置&#xff08;第 5.2 节&#xff09;、主流架…...

专业级 AI 提示生成工具清单

1. 引言 近年来&#xff0c;随着 GPT-3、GPT-4 等大规模预训练语言模型的广泛应用&#xff0c;提示&#xff08;Prompt&#xff09;工程作为驱动模型输出质量的重要环节&#xff0c;受到了各界的高度关注。精心设计、管理与优化提示&#xff0c;不仅能够大幅提高生成文本的准确…...

Web前端考核 JavaScript知识点详解

一、JavaScript 基础语法 1.1 变量声明 关键字作用域提升重复声明暂时性死区var函数级✅✅❌let块级❌❌✅const块级❌❌✅ 1.1.1变量提升的例子 在 JavaScript 中&#xff0c;var 声明的变量会存在变量提升的现象&#xff0c;而 let 和 const 则不会。变量提升是指变量的声…...

23种设计模式-生成器(Builder)设计模式

工厂方法设计模式 &#x1f6a9;什么是生成器设计模式&#xff1f;&#x1f6a9;生成器设计模式的特点&#x1f6a9;生成器设计模式的结构&#x1f6a9;生成器设计模式的优缺点&#x1f6a9;生成器设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么…...

Thinkphp(TP)框架漏洞攻略

1.环境搭建 vulhub/thinkphp/5-rce docker-compose up -d 2.访问靶场 远程命令执行&#xff1a; ? sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1] []whoami 远程代码执行&#xff1a; ? s/Index/\think\app/invokefunc…...

HTTP/HTTPS 中 GET 请求和 POST 请求的区别与联系

一、基础概念 HTTP (HyperText Transfer Protocol, 超文本传输协议) 是一种用于浏览器与服务器之间进行数据交互的协议。HTTPS (加密的 HTTP) 则通过 SSL/TLS 协议实现通信加密与数据安全性。 二、GET 和 POST 概述 GET 请求: 用于从服务器获取资源。 POST 请求: 用于将数据…...

2021年蓝桥杯第十二届CC++大学B组真题及代码

目录 1A&#xff1a;空间&#xff08;填空5分_单位转换&#xff09; 2B&#xff1a;卡片&#xff08;填空5分_模拟&#xff09; 3C&#xff1a;直线&#xff08;填空10分_数学排序&#xff09; 4D&#xff1a;货物摆放&#xff08;填空10分_质因数&#xff09; 5E&#xf…...

解锁 AWX+Ansible 自动化运维新体验:快速部署实战

Ansible 和 AWX 是自动化运维领域的强大工具组合。Ansible 是一个简单高效的 IT 自动化工具&#xff0c;而 AWX 则是 Ansible 的开源 Web 管理平台&#xff0c;提供图形化界面来管理 Ansible 任务。本指南将带你一步步在 Ubuntu 22.04 上安装 Ansible 和 AWX&#xff0c;使用 M…...

简洁、实用、无插件和更安全为特点的WordPress主题

简站WordPress主题是一款以简洁、实用、无插件和更安全为特点的WordPress主题&#xff0c;自2013年创立以来&#xff0c;凭借其设计理念和功能优势&#xff0c;深受用户喜爱。以下是对简站WordPress主题的详细介绍&#xff1a; 1. 设计理念 简站WordPress主题的核心理念是“崇…...

区块链学习总结

Hardhat 是一个用于 Ethereum 智能合约开发 的开发环境&#xff0c;专为 Solidity 语言编写的智能合约提供工具支持。它能够帮助开发者 编译、部署、测试和调试 智能合约&#xff0c;并提供一个本地的以太坊测试网络。 Hardhat 的核心功能 本地开发网络&#xff08;Hardhat Ne…...

可发1区的超级创新思路(python\matlab实现):基于周期注意力机制的TCN-Informer时间序列预测模型

首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 一、应用场景 该模型主要用于时间序列数据预测问题,包含功率预测、电池寿命预测、电机故障检测等等 二、模型整体介绍(本文以光伏功率预测为例) 1.1 核心创新点 本模型通过三阶段…...

案例4:鸢尾花分类(pytorch)

一、引言 鸢尾花分类是机器学习领域的经典案例&#xff0c;常用于演示分类算法的基本原理和应用。本案例使用 PyTorch 构建一个简单的神经网络模型&#xff0c;对鸢尾花进行分类。通过该案例&#xff0c;我们可以学习如何使用 PyTorch 进行数据处理、模型构建、训练和评估&…...

本地部署Stable Diffusion生成爆火的AI图片

直接上代码 Mapping("/send") Post public Object send(Body String promptBody) { JSONObject postSend new JSONObject(); System.out.println(promptBody); JSONObject body JSONObject.parseObject(promptBody); List<S…...

CCF-CSP历年真题答案1,2

本文代码主要来自up主圣斗士-DS-ALGO对历年真题的讲解&#xff0c;在此特别感谢。 侵权则删。 10.1_分蛋糕_2017_03 #include <iostream> using namespace std;int main() {int a[1000], n, k; // 定义数组a用于存储蛋糕的重量&#xff0c;整数n表示蛋糕的数量&#xf…...

【MySQL】一篇讲懂什么是聚簇索引和非聚簇索引(二级索引)以及什么是回表?

1.聚簇索引&#xff1a; 叶子节点直接存储了完整的数据行。 每个表只能有一个聚簇索引&#xff0c;通常是主键(Primary Key)。如果没有定义主键&#xff0c;则MySQL会选择一个唯一且非空索引作为聚簇索引。 特点&#xff1a; 数据存储&#xff1a;叶子结点存储完整的数据行…...

炫酷的HTML5粒子动画特效实现详解

炫酷的HTML5粒子动画特效实现详解 这里写目录标题 炫酷的HTML5粒子动画特效实现详解项目介绍技术栈项目架构1. HTML结构2. 样式设计 核心实现1. 粒子类设计2. 动画效果实现星空效果烟花效果雨滴效果 3. 鼠标交互 性能优化效果展示总结 项目介绍 本文将详细介绍如何使用HTML5 C…...

go-zero学习笔记

内容不多&#xff0c;只有部分笔记&#xff0c;剩下的没有继续学下去&#xff0c;包括路由与处理器、日志中间件、请求上下文 文章目录 1、go-zero核心库1.1 路由与处理器1.2 日志中间件1.3 请求上下文 1、go-zero核心库 1.1 路由与处理器 package mainimport ("github…...

QuecPython 网络协议之TCP/UDP协议最祥解析

概述 IP 地址与域名 IP 地址是网络中的主机地址&#xff0c;用于两台网络主机能够互相找到彼此&#xff0c;这也是网络通信能够成功进行的基础。IP 地址一般以点分十进制的字符串来表示&#xff0c;如192.168.1.1。 ​ 我们日常访问的网站&#xff0c;其所在的服务器主机都有…...

FPGA_YOLO(二)

上述对cnn卷积神经网络进行介绍,接下来对YOLO进行总结,并研究下怎么在FPGA怎么实现的方案。 对于一个7*7*30的输出 拥有49个cell 每一个cell都有两个bbox两个框,并且两个框所包含的信息拥有30个 4个坐标信息和一个置信度5个,剩下就是20个类别。 FPGA关于YOLO的部署 1…...

Camera2 与 CameraX 闲谈

目录 &#x1f4c2; 前言 1. &#x1f531; Camera2 2. &#x1f531; CameraX 3. &#x1f531; Camera2 与 CameraX 1&#xff09;使用复杂度与开发效率 2&#xff09;控制能力与应用场景 3&#xff09;设备兼容性与稳定性 4&#xff09;更新与维护 4. &#x1f4a0…...

【零基础入门unity游戏开发——2D篇】2D物理系统 —— 2D刚体组件(Rigidbody 2d)

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...

【论文#目标检测】YOLO9000: Better, Faster, Stronger

目录 摘要1.引言2.更好&#xff08;Better&#xff09;3.更快&#xff08;Faster&#xff09;4.更健壮&#xff08;Stronger&#xff09;使用 WordTree 组合数据集联合分类和检测评估 YOLO9000 5.结论 Author: Joseph Redmon; Ali Farhadi Published in: 2017 IEEE Conference …...

C++异常处理时的异常类型抛出选择

在 C 中选择抛出哪种异常类型&#xff0c;主要取决于错误的性质以及希望传达的语义信息。以下是一些指导原则&#xff0c;帮助在可能发生异常的地方选择合适的异常类型进行抛出&#xff1a; 1. std::exception 适用场景&#xff1a;作为所有标准异常的基类&#xff0c;std::e…...

centos 7 搭建FTP user-list用户列表

在 CentOS 7 上搭建基于 user_list 的 FTP 用户列表&#xff0c;你可以按以下步骤操作&#xff1a; 1. 安装 vsftpd 服务 若还未安装 vsftpd&#xff0c;可以使用以下命令进行安装&#xff1a; bash yum install -y vsftpd2. 启动并设置开机自启 vsftpd 服务 bash systemctl…...