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

掌握HttpClient技术:从基础到实战(Apache)

目录

前言

一、Apache HttpClient简介

二、HttpClient基础使用

1. 添加依赖

2. 创建HttpClient实例

3. 发送GET请求

4. 发送POST请求

三、HttpClient高级配置与实战案例

1. 连接池优化

2. 超时与重试配置

3. 文件上传(Multipart)

总结


前言

在Java 11之前的版本中,标准库提供的HttpURLConnection功能较为基础,难以满足复杂HTTP场景(如连接池管理、异步请求、灵活重试等)的需求。Apache HttpClient(属于Apache HttpComponents项目)作为Java生态中最成熟、功能最全面的HTTP客户端库之一,长期被广泛应用于企业级开发。本文将从设计、基础用法到实战案例,系统讲解Apache HttpClient的技术细节。


一、Apache HttpClient简介

Apache HttpClient是由Apache软件基金会维护的一款开源HTTP客户端库,它全面支持HTTP/1.1协议,并为用户提供了一系列强大的核心能力,使其成为开发高效、可靠网络应用的理想选择,其提供以下核心能力:

  • 连接池管理:Apache HttpClient内置了高效的连接池管理机制,能够复用TCP连接,从而显著减少连接建立和断开的握手开销。通过连接池,客户端能够在多个请求之间共享连接,这不仅提升了性能,还降低了资源消耗。
  • 灵活的请求配置:该库提供了丰富的配置选项,支持设置请求超时、配置代理服务器、管理重定向策略、处理Cookie以及实现身份认证等,这些配置选项使得HttpClient能够灵活应对各种复杂的网络环境和请求需求。
  • 扩展性:Apache HttpClient通过拦截器(Interceptor)机制,允许用户自定义日志记录、请求重试、响应缓存等逻辑,拦截器机制使得HttpClient具有高度的可扩展性,能够轻松集成到各种复杂的系统中。
  • 同步/异步请求支持:HttpClient不仅兼容传统的阻塞I/O模型,允许用户发起同步请求并等待响应,还提供了异步非阻塞请求的支持(需结合异步HTTP客户端)。异步请求支持使得HttpClient能够处理大量并发请求,同时保持应用的响应性和可扩展性。

用户在选择HttpClient版本时,需要根据项目的具体需求、目标Java版本以及对新特性的需求进行权衡,版本选择如下:

  • HttpClient 4.x:作为广泛使用的稳定版本,HttpClient 4.x已经经过了充分的测试和验证,适用于大多数应用场景。
  • HttpClient 5.x:作为新一代API,HttpClient 5.x在性能和功能上进行了多项改进,并支持HTTP/2协议(需Java 8及以上版本)。

二、HttpClient基础使用

1. 添加依赖

为了在Java项目中使用Apache HttpClient,需要在项目的构建文件中添加相应的依赖,Maven配置如下(以4.5.13版本为例):

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version>
</dependency>

2. 创建HttpClient实例

创建默认实例:

为了发送HTTP请求,需要创建一个CloseableHttpClient实例,可以通过HttpClients.createDefault()方法直接获取预配置的HttpClient实例,该实例采用以下默认参数:

CloseableHttpClient httpClient = HttpClients.createDefault();

非默认配置的实例

以下案例展示如何通过HttpClientBuilder定制化配置CloseableHttpClient,覆盖连接超时、代理、重试策略、SSL证书校验等关键参数:

import org.apache.http.HttpHost;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.StandardHttpRequestRetryHandler;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.ssl.SSLContextBuilder;
import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;
import java.util.concurrent.TimeUnit;public class ApacheHttpClientExample {public static CloseableHttpClient createCustomHttpClient() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {// 连接池配置PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();connManager.setMaxTotal(200);          // 最大连接数connManager.setDefaultMaxPerRoute(50); // 每个路由(目标主机)的最大并发连接数connManager.closeIdleConnections(60, TimeUnit.SECONDS); // 关闭空闲超时连接// 超时配置RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000)    // 连接建立超时(5秒).setSocketTimeout(15000)    // 数据传输超时(15秒).setConnectionRequestTimeout(3000) // 从连接池获取连接的超时(3秒).build();// SSL配置(信任自签名证书)SSLContext sslContext = SSLContextBuilder.create().loadTrustMaterial(new TrustSelfSignedStrategy()).build();SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext,new String[]{"TLSv1.2", "TLSv1.3"}, // 支持的协议版本null,SSLConnectionSocketFactory.getDefaultHostnameVerifier());// 重试策略StandardHttpRequestRetryHandler retryHandler = new StandardHttpRequestRetryHandler(3,      // 最大重试次数true    // 对非幂等请求(如POST)也重试(需业务确保安全性));// 构建HttpClientreturn HttpClientBuilder.create().setConnectionManager(connManager)          // 连接池.setDefaultRequestConfig(requestConfig)     // 超时配置.setSSLSocketFactory(sslSocketFactory)      // SSL配置.setRetryHandler(retryHandler)              // 重试策略.setProxy(new HttpHost("proxy.example.com", 8080)) // 代理服务器.disableCookieManagement()                  // 禁用Cookie管理(按需启用).setUserAgent("Custom-Client/1.0")          // 自定义User-Agent.addInterceptorFirst((HttpRequestInterceptor) (request, context) ->request.addHeader("X-Request-ID", UUID.randomUUID().toString())) // 自定义请求头.build();}public static void main(String[] args) {try {CloseableHttpClient httpClient = createCustomHttpClient();// 使用httpClient进行HTTP请求// ...} catch (Exception e) {e.printStackTrace();}}
}

3. 发送GET请求

发送GET请求是HttpClient最常见的用法之一,以下是一个使用Apache HttpClient库发送HTTP GET请求的案例:

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;public class ApacheHttpClientExample {public static void main(String[] args) {try (CloseableHttpClient httpClient = HttpClients.createDefault()) {HttpGet request = new HttpGet("https://jsonplaceholder.typicode.com/posts/1");try (CloseableHttpResponse response = httpClient.execute(request)) {System.out.println("Status Code: " + response.getStatusLine().getStatusCode());String responseBody = EntityUtils.toString(response.getEntity());System.out.println("Response Body: " + responseBody);}} catch (Exception e) {e.printStackTrace();}}
}

该案例在main方法中,使用try-with-resources语句创建了CloseableHttpClient实例,该实例负责发送HTTP请求,并创建了一个HttpGet请求对象,目标URL指向https://jsonplaceholder.typicode.com/posts/1(提供假数据的API)。然后再次使用try-with-resources语句执行该请求并获取CloseableHttpResponse响应对象。在响应对象的作用域内,程序打印了HTTP响应的状态码,并使用EntityUtils.toString方法将响应实体转换为字符串,最后打印出响应体的内容。如果在执行请求或处理响应时发生任何异常,这些异常将被捕获并打印到标准错误输出。

https://jsonplaceholder.typicode.com/posts/1的内容如下:

运行结果:

4. 发送POST请求

发送POST请求与GET请求类似,只是需要在请求体中包含要发送的数据,通常POST请求用于提交表单数据或JSON数据。以下案例展示了如何使用Apache HttpClient库在Java中发送一个包含JSON请求体的HTTP POST请求,并处理响应。

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;public class ApacheHttpClientExample {public static void main(String[] args) {try (CloseableHttpClient httpClient = HttpClients.createDefault()) {HttpPost request = new HttpPost("https://jsonplaceholder.typicode.com/posts");// 设置JSON请求体String json = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";request.setEntity(new StringEntity(json, ContentType.APPLICATION_JSON));// 添加自定义请求头request.addHeader("X-Custom-Header", "value");try (CloseableHttpResponse response = httpClient.execute(request)) {System.out.println("Status Code: " + response.getStatusLine().getStatusCode());String responseBody = EntityUtils.toString(response.getEntity());System.out.println("Response Body: " + responseBody);}} catch (Exception e) {e.printStackTrace();}}
}

在方法中,利用try-with-resources语句创建了CloseableHttpClient实例以确保资源正确关闭。之后创建HttpPost请求对象并指向目标URL,设置了JSON格式的请求体内容类型,并附加了自定义请求头,通过执行请求并捕获响应,程序打印了HTTP响应的状态码和响应体内容。

运行结果:

Status Code: 201
Response Body: {"title":"foo","body":"bar","userId":1,"id":101}

三、HttpClient高级配置与实战案例

1. 连接池优化

在高性能的HTTP客户端应用中,连接池的管理是至关重要的。Apache HttpClient库提供了一个强大的工具PoolingHttpClientConnectionManager,它允许开发者高效地管理和复用HTTP连接,从而显著提升应用的性能和资源利用率。通过PoolingHttpClientConnectionManager管理连接池的案例如下:

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;public class ApacheHttpClientExample {public static void main(String[] args) {PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();connManager.setMaxTotal(200);          // 最大连接数connManager.setDefaultMaxPerRoute(20); // 每个路由(目标主机)的最大连接数try (CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connManager).build()) {// 执行高并发请求...} catch (Exception e) {e.printStackTrace();}}
}

2. 超时与重试配置

在构建高性能、高可靠性的HTTP客户端应用时,超时与重试配置是两个至关重要的方面,它们不仅影响应用的响应速度,还直接关系到应用的稳定性和用户体验。设置超时与重试配置的案例如下:

import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;public class ApacheHttpClientExample {public static void main(String[] args) {RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000)    // 连接超时5秒.setSocketTimeout(10000)    // 数据传输超时10秒.build();// 自定义重试策略(默认重试3次)HttpClientBuilder builder = HttpClients.custom().setDefaultRequestConfig(requestConfig).setRetryHandler(new DefaultHttpRequestRetryHandler(3, true));try (CloseableHttpClient httpClient = builder.build()) {// 执行请求...} catch (Exception e) {e.printStackTrace();}}
}

3. 文件上传(Multipart)

为了在Java项目中使用Apache HttpClient进行文件上传,需要在项目的构建文件中添加相应的依赖,Maven配置如下(以4.5.13版本为例):

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId><version>4.5.13</version>
</dependency>

以下是一个使用了Apache HttpClient来发送包含文件上传HTTP POST请求的案例:

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;import java.io.File;public class ApacheHttpClientExample {public static void main(String[] args) {try (CloseableHttpClient httpClient = HttpClients.createDefault()) {HttpPost request = new HttpPost("https://example.com/upload");// 构建Multipart请求体MultipartEntityBuilder builder = MultipartEntityBuilder.create();builder.addPart("file", new FileBody(new File("test.txt")));builder.addTextBody("comment", "Sample File");request.setEntity(builder.build());try (CloseableHttpResponse response = httpClient.execute(request)) {// 处理响应...}} catch (Exception e) {e.printStackTrace();}}
}

总结

Apache HttpClient在Java 11之前的版本中是处理复杂HTTP通信的首选方案。通过灵活的配置、高效的连接池管理和丰富的扩展能力,它能够满足企业级应用的高性能需求。然而,随着Java 11+标准库HttpClient的普及,新项目建议优先使用原生方案,而旧系统仍可依赖Apache HttpClient的稳定性和成熟生态。

相关文章:

掌握HttpClient技术:从基础到实战(Apache)

目录 前言 一、Apache HttpClient简介 二、HttpClient基础使用 1. 添加依赖 2. 创建HttpClient实例 3. 发送GET请求 4. 发送POST请求 三、HttpClient高级配置与实战案例 1. 连接池优化 2. 超时与重试配置 3. 文件上传&#xff08;Multipart&#xff09; 总结 前言 …...

KEYSIGHT N9320B是德科技N9320B频谱分析仪

KEYSIGHT N9320B是德科技N9320B频谱分析仪 附加功能&#xff1a; 频率范围&#xff1a;9 kHz 至 3 GHz 分辨率带宽&#xff1a;10 Hz 至 1 MHz DANL&#xff1a;-130 dBm&#xff0c;-148 dBm&#xff0c;带可选前置放大器 整体幅度精度&#xff1a;<1.5 dB 最小非零扫…...

EXSI通过笔记本wifi上外网配置

我有一台服务器安装了EXSI&#xff0c;服务器IP地址配置的是192.168.137.2&#xff0c;在EXSI中创建了一个linux虚拟机&#xff0c;ip地址是192.168.137.22。现在我有一个windows笔记本&#xff0c;使用家庭的wife上外网&#xff0c;wife给自动分配了一个192.168.0.106地址&…...

Java异常处理的全面指南

Java异常处理的全面指南 一、Java异常的基础概念1.1 什么是异常1.2 异常类的层次结构 二、Java异常的处理方式2.1 try-catch块2.2 throws关键字2.3 throw关键字 三、自定义异常3.1 自定义受检异常3.2 自定义非受检异常 四、Java异常处理的最佳实践4.1 捕获合适粒度的异常4.2 避…...

sql知识梳理(超全,超详细,自用)

目录 通识 查询的基本语法 数据库&#xff08;database&#xff09;操作 表&#xff08;table&#xff09;的操作 表中列的操作 索引操作 表中行的操作 insert into语句 update语句 删除语句 select语句 表与表之间的关系 连接查询 子查询 视图 数据备份与还原 …...

[ Qt ] | QPushButton常见用法

目录 绑定键盘快捷键 前面已经说了很多用法了&#xff0c;下面主要说说绑定键盘&#xff0c;设置Icon图片。 绑定键盘快捷键 实现四个按钮&#xff0c;可以使用wsad来控制另一个按钮的上下左右的移动。 #include "widget.h" #include "ui_widget.h"Wid…...

WEB3——为什么做NFT铸造平台?

相必之前看过我的入门项目推荐关于简易NFT铸造平台的文章。会有一些疑惑 WEB3—— 简易NFT铸造平台&#xff08;ERC-721&#xff09;-入门项目推荐-CSDN博客 WEB3&#xff0c;我直接在https://nft.storage网站里上传图片不行吗&#xff0c;必须用合约铸造NFT&#xff1f; 我做…...

电脑驱动程序更新工具, 3DP Chip 中文绿色版,一键更新驱动!

介绍 3DP Chip 是一款免费的驱动程序更新工具&#xff0c;可以帮助用户快速、方便地识别和更新计算机硬件驱动程序。 驱动程序更新工具下载 https://pan.quark.cn/s/98895d47f57c 软件截图 软件特点 简单易用&#xff1a;用户界面简洁明了&#xff0c;操作方便&#xff0c;…...

【机器学习基础】机器学习入门核心:数学基础与Python科学计算库

机器学习入门核心&#xff1a;数学基础与Python科学计算库 一、核心数学基础回顾1. 函数与导数2. Taylor公式3. 概率论基础4. 统计量5. 重要定理6. 最大似然估计&#xff08;MLE&#xff09;7. 线性代数 二、Python科学计算库精要1. NumPy&#xff1a;数值计算核心2. SciPy&…...

上交具身机器人的视觉运动导航!HTSCN:融合空间记忆与语义推理认知的导航策略

作者&#xff1a;Qiming Liu 1 ^{1} 1, Guangzhan Wang 2 ^{2} 2, Zhe Liu 3 , 4 ^{3,4} 3,4 and Hesheng Wang 1 , 3 , 5 , 6 ^{1,3,5,6} 1,3,5,6单位&#xff1a; 1 ^{1} 1上海交通大学自动化系&#xff0c; 2 ^{2} 2上海交通大学软件学院&#xff0c; 3 ^{3} 3上海交通大学教…...

【C++并发编程01】初识C++并发编程

1、并发是什么 并发是指两个或更多独立的活动同时发生&#xff0c;现实生活中常见的并发场景如边吃饭边看手机。 1.1、计算机中的并发&#xff1a; 计算机领域的并发是指在单个系统里同时执行多个独立的任务&#xff0c;而非顺序的进行一些活动。 我们在电脑上能够边听音乐边和…...

Mysql库的操作和表的操作

Mysql库和表的操作 库的操作1.查看数据库列表2.创建数据库3.使用数据库4.查看当前在那个数据库中5.显示数据库的创建语句6.修改数据库7.删除数据库8.备份和恢复数据库9.查看数据的连接情况(简单来说就是查看有多少人使用你的数据库) 表的操作1.创建表2.查看表结构3.修改表本身(…...

LangChain-结合GLM+SQL+函数调用实现数据库查询(三)

针对 LangChain-结合GLM+SQL+函数调用实现数据库查询(二)-CSDN博客 进一步简化 通过 LangChain 和大语言模型(GLM-4)实现了一个 AI 代理,能够根据自然语言提问自动生成 SQL 查询语句,并连接 MySQL 数据库执行查询,最终返回结果。 整个流程如下: 用户提问 → AI 生成 SQ…...

word文档格式规范(论文格式规范、word格式、论文格式、文章格式、格式prompt)

文章目录 prompt prompt [格式要求] - 字体&#xff1a;中文宋体小四&#xff1b;英文Times New Roman 12pt&#xff1b;标题黑体 - 行距&#xff1a;1.5倍&#xff08;段前段后0行&#xff09; - 边距&#xff1a;A4默认&#xff08;上下2.54cm&#xff0c;左右3.17cm&…...

Ubuntu 桌面版忘记账户密码的重置方法

如果你忘记了 Ubuntu 桌面版的用户密码&#xff0c;可以通过进入恢复模式&#xff08;Recovery Mode&#xff09;来重置密码。以下是详细步骤&#xff1a; 一、进入 GRUB 引导菜单 重启计算机&#xff1a;点击关机按钮&#xff0c;选择重启。在启动时按住 Shift 键&#xff1…...

抖音商城抓包 分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 抓包展示 总结 1.出于安全考虑,本章未…...

[SC]sc_signal_rv的用法和sc_signal相比有什么优势?

sc_signal_rv的用法和sc_signal相比有什么优势? 在 SystemC 中,sc_signal<T> 是最常用的单驱动(single‐driver)信号通道;而 sc_signal_rv<W>(“rv” = resolved vector)则是一种多驱动、带总线(tri-state)分辨功能的信号。下面分几点来说明它们的…...

掌握 FreeRTOS:打造高效嵌入式系统的第一步

实例对比说明&#xff1a; 手机: 点击相机 -> 操作系统 -> 打开摄像头 无操作系统: 相机 -> 打开摄像头也能实现&#xff0c;但方式死板、不支持第三方应用 MCU 对比说明&#xff1a; 裸机开发: MCU -> 直接控制硬件 使用操作系统: MCU -> 操作系统 -> 硬…...

性能优化 - 案例篇:数据一致性

文章目录 Pre引言1. 分布式缓存概念2. Redis 与 Memcached 区别概览3. Spring Boot 中使用 Redis3.1 引入依赖与常用客户端3.2 RedisTemplate 的基本用法3.3 Spring Cache 注解式缓存 4. 秒杀业务简介及挑战5. Lua 脚本实现原子库存扣减5.1 准备阶段&#xff1a;数据预加载5.2 …...

Spring框架学习day6--事务管理

Spring事务管理 Spring事务管理是在AOP的基础上&#xff0c;当我们的方法完全执行成功后&#xff0c;再提交事务&#xff0c;如果方法中有异常&#xff0c;就不提交事务 Spring中的事务管理有两种方式&#xff1a; ​ 1.编程式事务 ​ 需要我们在业务代码中手动提交 ​ 2.声明式…...

免费酒店管理系统+餐饮系统+小程序点餐——仙盟创梦IDE

酒店系统主屏幕 房间管理 酒店管理系统的房间管理&#xff0c;可实现对酒店所有房间的实时掌控。它能清晰显示房间状态&#xff0c;如已预订、已入住、空闲等&#xff0c;便于高效安排入住与退房&#xff0c;合理分配资源&#xff0c;提升服务效率&#xff0c;保障酒店运营有条…...

Git企业级项目管理实战

目录 1. 准备工作 2. 添加成员 2.1 添加企业成员 2.2 添加项目成员 2.3 添加仓库开发人员 3. 开发场景 - 基于git flow模型的实践 3.1 新需求加入 3.2 修复测试环境 Bug 3.3 修改预发布环境Bug 3.4 修改正式环境 Bug 3.5 紧急修复正式环境 Bug 4. 拓展阅读 4.1 其…...

【实例】事业单位学习平台自动化操作

目录 一、创作背景: 二、实现逻辑: 三、代码分析【Deepseek分析】: 1) 主要功能 2)核心组件 2.1 GUI界面 (AutomationApp类) 2.2 浏览器自动化 2.3 平台特定处理 3) 关键技术 4)代码亮点 5)总结 四、运行截图: 五、程序代码: 特别声明:***本代码仅限编程学…...

4.8.3 利用SparkSQL统计每日新增用户

在本次实战中&#xff0c;我们的任务是利用Spark SQL统计每日新增用户数。首先&#xff0c;我们准备了用户访问历史数据&#xff0c;并将其上传至HDFS。然后&#xff0c;通过Spark的交互式编程环境&#xff0c;我们读取了用户文件并将其转换为结构化的DataFrame。接着&#xff…...

创建ipv6 only和ipv6+ip4的k8s集群的注意事项

关键字 : CNI calico vxlan flannel ipv6-only ipv6ipv4 在搭建ipv6-only或ipv6ipv4的k8s集群时&#xff0c;在worker节点加入集群后&#xff0c;发现worker节点上的CNI启动失败。 以下是calico的启动失败情况 : kubectl get pod -A输出如下 : NAMESPACE NAME …...

Qt概述:基础组件的使用

1. Qt框架简介 Qt是一个跨平台的C图形用户界面应用程序开发框架&#xff0c;它包含了丰富的GUI组件和强大的功能库。本次示例代码展示了Qt的几个核心概念&#xff1a; QMainWindow&#xff1a;主窗口类&#xff0c;提供标准的应用程序框架**信号与槽**机制&#xff1a;Qt的核…...

判断使用什么技术来爬取数据详细讲解

判断目标网站使用哪种数据加载形式是爬虫开发的第一步&#xff0c;也是最关键的一步。以下是系统化的诊断方法和步骤&#xff1a; 核心诊断流程 (使用浏览器开发者工具 - Chrome/Firefox为例) 初始观察 (肉眼判断) 页面加载后数据是否立刻可见&#xff1f; 是 → 可能是静态HTM…...

YOLOV7改进之融合深浅下采样模块(DSD Module)和轻量特征融合模块(LFI Module)

目录 一、研究背景​ 二. 核心创新点​ ​2.1 避免高MAC操作​ ​2.2 DSDM-LFIM主干网络​ 2.3 P2小目标检测分支​ ​3. 代码复现指南​ 环境配置 关键修改点 ​4. 实验结果对比​ 4.1 VisDrone数据集性能 4.2 边缘设备部署 4.3 检测效果可视化 ​5. 应用场景​ …...

【仿生机器人】仿生机器人认知-情感系统架构设计报告

来自 gemini 2.5 1. 执行摘要 本报告旨在为仿生机器人头部设计一个全面的认知-情感软件架构&#xff0c;以实现自然、情感智能的互动。拟议的架构将使机器人能够像人类一样&#xff0c;动态生成情绪、进行复杂的表情表达&#xff08;包括情绪掩饰&#xff09;、拥有强大的记忆…...

数学建模期末速成 多目标规划

内容整理自2-6-2 运筹优化类-多目标规划模型Python版讲解_哔哩哔哩_bilibili 求有效解的几种常用方法 线性加权法√ 根据目标的重要性确定一个权重&#xff0c;以目标函数的加权平均值为评价函数&#xff0c;使其达到最优。ɛ约束法 根据决策者的偏好&#xff0c;选择一个主要…...