【史上最全面ESP32教程】http通信
文章目录
- 前言
- HTTP协议是什么?
- HTTP协议的特点
- HTTP协议的常见应用
- esp32 使用http通信
- 通信流程
- 基础使用
- HTTPClient 常用的函数
- 函数介绍:
- `void end(void);`
- `bool connected(void);`
- `void setReuse(bool reuse);`
- `void setUserAgent(const String& userAgent);`
- `void setAuthorization(const char * user, const char * password);`
- `int GET();`
- `String getString(void);`
- `int PATCH(uint8_t * payload, size_t size);`
- `int PATCH(String payload);`
- `int POST(uint8_t * payload, size_t size);`
- `int POST(String payload);`
- `int PUT(uint8_t * payload, size_t size);`
- `int PUT(String payload);`
- `int sendRequest(const char * type, String payload);`
- `void addHeader(const String& name, const String& value, bool first = false, bool replace = true);`
- `void collectHeaders(const char* headerKeys[], const size_t headerKeysCount);`
- `String header(const char* name);`
- `String header(size_t i);`
- `String headerName(size_t i);`
- `int headers();`
- `bool hasHeader(const char* name);`
- `int getSize(void);`
- `const String &getLocation(void);`
- `WiFiClient& getStream(void);`
- `WiFiClient* getStreamPtr(void);`
- `int writeToStream(Stream* stream);`
- `String getString(void);`
- `static String errorToString(int error);`
- `void setCookieJar(CookieJar* cookieJar);`
- `void resetCookieJar();`
- `void clearAllCookies();`
- 总结
前言
随着物联网(IoT)的快速发展,ESP32作为一款高性能、低功耗的Wi-Fi和蓝牙双模芯片,受到了广泛的关注和应用。在物联网设备中,HTTP协议是实现设备与服务器之间通信的常用协议。本文将介绍HTTP协议的基本概念及其常见应用场景。
HTTP协议是什么?
HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于传输超文本的应用层协议。它是万维网(WWW)的基础,定义了客户端(如浏览器)与服务器之间的通信规则。HTTP协议采用请求-响应模式,客户端发送请求,服务器返回响应。
HTTP协议的特点
- 无状态:每次请求都是独立的,服务器不会保留之前请求的状态。
- 灵活性:支持多种数据格式,如HTML、JSON、XML等。
- 简单性:易于实现和使用,广泛应用于Web开发。
HTTP协议的常见应用
- Web浏览:浏览器通过HTTP协议请求网页内容,服务器返回HTML页面。
- API通信:物联网设备通过HTTP协议与服务器进行数据交互,如上传传感器数据或获取控制指令。
- 文件传输:通过HTTP协议下载或上传文件,如软件更新或日志文件。
esp32 使用http通信
通信流程
- 连接网络
- 开始http通信
- 发送请求并获取响应
- 关闭连接
基础使用
我们需要使用HTTPClient
类来进行通信
如果我们要开启一个http通信使用下面这个函数,参数为你要http通信的url:
bool begin(String url);
如果我们要GET一个内容,我们可以使用下面这个函数:
int GET();
他的返回值为状态码。
状态码有下面这些取值:
- 200 OK:请求成功。具体的含义取决于HTTP方法。例如,GET方法表示资源已被获取并在消息体中传输。
- 201 Created:请求成功,并且新的资源已经作为结果创建。这通常是在POST请求或某些PUT请求后发送的响应。
- 204 No Content:没有要发送的内容,但头部可能有用。用户代理可能会使用新的头部更新此资源的缓存头部。
- 301 Moved Permanently:请求的URL已永久移动到新位置,并且将来的引用应使用新的URL。
- 400 Bad Request:服务器无法理解请求的语法。
- 401 Unauthorized:请求需要用户验证。
- 403 Forbidden:服务器理解请求,但拒绝执行它。
- 404 Not Found:服务器找不到请求的资源。
- 500 Internal Server Error:服务器遇到错误,无法完成请求
我们可以通过下面这个函数来获取GET的返回值:
String getString(void);
我们可以使用下面这个函数来关闭http连接:
void end(void);
#include <WiFi.h>
#include <HTTPClient.h>const char* ssid = "......."; // WiFi网络名称
const char* password = "......."; // WiFi网络密码void setup() {Serial.begin(115200); // 初始化串口通信// 连接到WiFi网络WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.println("Connecting to WiFi...");}Serial.println("Connected to WiFi");// 设置HTTPClient对象HTTPClient http;// 为GET请求设置目标URLString url = "http://example.com/api/data"; // 替换为你的目标URL// 发送GET请求http.begin(url);// 发送请求并获取响应int httpResponseCode = http.GET();if (httpResponseCode > 0) { // 如果收到响应Serial.print("HTTP Response code: ");Serial.println(httpResponseCode); // 打印响应代码String payload = http.getString(); // 获取响应内容Serial.println(payload); // 打印响应内容} else {Serial.print("Error code: ");Serial.println(httpResponseCode); // 打印错误代码}http.end(); // 关闭连接
}void loop() {// 程序主循环,此处不需要添加其他代码
}
HTTPClient 常用的函数
函数介绍:
void end(void);
- 函数原型:
void end(void);
- 函数作用: 关闭HTTPClient对象,释放资源。
- 函数参数: 无。
- 返回值的作用: 无返回值。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); // 处理响应 http.end(); // 关闭HTTP连接
bool connected(void);
- 函数原型:
bool connected(void);
- 函数作用: 检查HTTPClient对象是否已连接到服务器。
- 函数参数: 无。
- 返回值的作用: 返回
true
表示连接成功,返回false
表示未连接或连接已断开。 - 示例代码:
HTTPClient http; if (http.connected()) {// 执行请求操作 } else {// 重新连接或处理断开连接情况 }
void setReuse(bool reuse);
- 函数原型:
void setReuse(bool reuse);
- 函数作用: 设置是否启用HTTP keep-alive功能,允许多次复用同一TCP连接。
- 函数参数:
reuse
:布尔值,true
表示启用keep-alive,false
表示禁用。
- 返回值的作用: 无返回值。
- 示例代码:
HTTPClient http; http.setReuse(true); // 启用keep-alive
void setUserAgent(const String& userAgent);
- 函数原型:
void setUserAgent(const String& userAgent);
- 函数作用: 设置HTTP请求的用户代理(User-Agent)标头。
- 函数参数:
userAgent
:String类型,要设置的用户代理字符串。
- 返回值的作用: 无返回值。
- 示例代码:
HTTPClient http; http.setUserAgent("ESP32 Client");
void setAuthorization(const char * user, const char * password);
- 函数原型:
void setAuthorization(const char * user, const char * password);
- 函数作用: 设置基本身份验证的用户名和密码。
- 函数参数:
user
:用户名字符串。password
:密码字符串。
- 返回值的作用: 无返回值。
- 示例代码:
HTTPClient http; http.setAuthorization("username", "password");
int GET();
- 函数原型:
int GET();
- 函数作用: 发送HTTP GET请求并接收响应。
- 函数参数: 无。
- 返回值的作用: 返回HTTP响应状态代码(例如200表示成功)。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); // 处理响应
String getString(void);
- 函数原型:
String getString(void);
- 函数作用: 获取HTTP响应的正文内容。
- 函数参数: 无。
- 返回值的作用: 返回包含HTTP响应正文内容的String对象。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); if (httpResponseCode > 0) {String response = http.getString();Serial.println(response); }
int PATCH(uint8_t * payload, size_t size);
- 函数原型:
int PATCH(uint8_t * payload, size_t size);
- 函数作用: 发送HTTP PATCH请求并附带数据。
- 函数参数:
payload
:指向要发送数据的字节数组的指针。size
:要发送数据的大小(字节数)。
- 返回值的作用: 返回HTTP响应状态代码。
- 示例代码:
HTTPClient http; uint8_t data[] = { 0x01, 0x02, 0x03 }; int httpResponseCode = http.PATCH(data, sizeof(data));
int PATCH(String payload);
- 函数原型:
int PATCH(String payload);
- 函数作用: 发送HTTP PATCH请求并附带数据(字符串形式)。
- 函数参数:
payload
:要发送的数据字符串。
- 返回值的作用: 返回HTTP响应状态代码。
- 示例代码:
HTTPClient http; String data = "key=value"; int httpResponseCode = http.PATCH(data);
int POST(uint8_t * payload, size_t size);
- 函数原型:
int POST(uint8_t * payload, size_t size);
- 函数作用: 发送HTTP POST请求并附带数据。
- 函数参数:
payload
:指向要发送数据的字节数组的指针。size
:要发送数据的大小(字节数)。
- 返回值的作用: 返回HTTP响应状态代码。
- 示例代码:
HTTPClient http; uint8_t data[] = { 0x01, 0x02, 0x03 }; int httpResponseCode = http.POST(data, sizeof(data));
int POST(String payload);
- 函数原型:
int POST(String payload);
- 函数作用: 发送HTTP POST请求并附带数据(字符串形式)。
- 函数参数:
payload
:要发送的数据字符串。
- 返回值的作用: 返回HTTP响应状态代码。
- 示例代码:
HTTPClient http; String data = "key=value"; int httpResponseCode = http.POST(data);
int PUT(uint8_t * payload, size_t size);
- 函数原型:
int PUT(uint8_t * payload, size_t size);
- 函数作用: 发送HTTP PUT请求并附带数据。
- 函数参数:
payload
:指向要发送数据的字节数组的指针。size
:要发送数据的大小(字节数)。
- 返回值的作用: 返回HTTP响应状态代码。
- 示例代码:
HTTPClient http; uint8_t data[] = { 0x01, 0x02, 0x03 }; int httpResponseCode = http.PUT(data, sizeof(data));
int PUT(String payload);
- 函数原型:
int PUT(String payload);
- 函数作用: 发送HTTP PUT请求并附带数据(字符串形式)。
- 函数参数:
payload
:要发送的数据字符串。
- 返回值的作用: 返回HTTP响应状态代码。
- 示例代码:
HTTPClient http; String data = "key=value"; int httpResponseCode = http.PUT(data);
int sendRequest(const char * type, String payload);
- 函数原型:
int sendRequest(const char * type, String payload);
- 函数作用: 发送自定义类型的HTTP请求,并附带数据(字符串形式)。
- 函数参数:
type
:HTTP请求类型,例如 “GET”, “POST”, “PUT” 等。payload
:要发送的数据字符串。
- 返回值的作用: 返回HTTP响应状态代码。
- 示例代码:
HTTPClient http; int httpResponseCode = http.sendRequest("POST", "key=value");
void addHeader(const String& name, const String& value, bool first = false, bool replace = true);
- 函数原型:
void addHeader(const String& name, const String& value, bool first = false, bool replace = true);
- 函数作用: 添加HTTP请求头。
- 函数参数:
name
:头部字段的名称。value
:头部字段的值。first
:可选参数,默认为false
。如果为true
,则将新头部添加到头部列表的开头。replace
:可选参数,默认为true
。如果为true
,则替换现有的同名头部;如果为false
,则添加到现有同名头部后面。
- 返回值的作用: 无返回值。
- 示例代码:
HTTPClient http; http.addHeader("Content-Type", "application/json");
void collectHeaders(const char* headerKeys[], const size_t headerKeysCount);
- 函数原型:
void collectHeaders(const char* headerKeys[], const size_t headerKeysCount);
- 函数作用: 指定要收集的HTTP响应头。
- 函数参数:
headerKeys
:指向包含要收集的头部字段名称的数组。headerKeysCount
:数组中头部字段名称的数量。
- 返回值的作用: 无返回值。
- 示例代码:
const char* headersToCollect[] = { "Content-Length", "Content-Type" }; HTTPClient http; http.collectHeaders(headersToCollect, sizeof(headersToCollect) / sizeof(headersToCollect[0]));
String header(const char* name);
- 函数原型:
String header(const char* name);
- 函数作用: 获取指定名称的HTTP响应头值。
- 函数参数:
name
:要获取的头部字段名称。
- 返回值的作用: 返回包含头部字段值的String对象。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); String contentType = http.header("Content-Type");
String header(size_t i);
- 函数原型:
String header(size_t i);
- 函数作用: 获取指定索引位置的HTTP响应头值。
- 函数参数:
i
:要获取的头部字段的索引(从0开始)。
- 返回值的作用: 返回包含头部字段值的String对象。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); String firstHeader = http.header(0);
String headerName(size_t i);
- 函数原型:
String headerName(size_t i);
- 函数作用: 获取指定索引位置的HTTP响应头名称。
- 函数参数:
i
:要获取的头部字段的索引(从0开始)。
- 返回值的作用: 返回包含头部字段名称的String对象。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); String firstName = http.headerName(0);
int headers();
- 函数原型:
int headers();
- 函数作用: 获取HTTP响应中头部字段的数量。
- 函数参数: 无。
- 返回值的作用: 返回头部字段的数量。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); int numHeaders = http.headers();
bool hasHeader(const char* name);
- 函数原型:
bool hasHeader(const char* name);
- 函数作用: 检查HTTP响应中是否存在指定名称的头部字段。
- 函数参数:
name
:要检查
的头部字段名称。
- 返回值的作用: 如果存在指定名称的头部字段,则返回
true
;否则返回false
。 - 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); if (http.hasHeader("Content-Type")) {// 处理存在Content-Type头部的情况 }
int getSize(void);
- 函数原型:
int getSize(void);
- 函数作用: 获取HTTP响应正文的大小(字节数)。
- 函数参数: 无。
- 返回值的作用: 返回HTTP响应正文的大小。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); int contentSize = http.getSize();
const String &getLocation(void);
- 函数原型:
const String &getLocation(void);
- 函数作用: 获取HTTP响应中的
Location
头部字段的值,用于处理重定向。 - 函数参数: 无。
- 返回值的作用: 返回包含
Location
头部字段值的String对象的引用。 - 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); String redirectLocation = http.getLocation();
WiFiClient& getStream(void);
- 函数原型:
WiFiClient& getStream(void);
- 函数作用: 获取底层的WiFiClient对象,用于直接访问底层网络连接。
- 函数参数: 无。
- 返回值的作用: 返回一个WiFiClient对象的引用。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); WiFiClient& stream = http.getStream();
WiFiClient* getStreamPtr(void);
- 函数原型:
WiFiClient* getStreamPtr(void);
- 函数作用: 获取底层的WiFiClient对象指针,用于直接访问底层网络连接。
- 函数参数: 无。
- 返回值的作用: 返回一个指向WiFiClient对象的指针。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); WiFiClient* streamPtr = http.getStreamPtr();
int writeToStream(Stream* stream);
- 函数原型:
int writeToStream(Stream* stream);
- 函数作用: 将HTTP响应内容写入给定的流(Stream)对象。
- 函数参数:
stream
:指向目标流对象的指针。
- 返回值的作用: 返回写入流的字节数。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); WiFiClient client; int bytesWritten = http.writeToStream(&client);
String getString(void);
- 函数原型:
String getString(void);
- 函数作用: 获取HTTP响应的正文内容。
- 函数参数: 无。
- 返回值的作用: 返回包含HTTP响应正文内容的String对象。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); String response = http.getString();
static String errorToString(int error);
- 函数原型:
static String errorToString(int error);
- 函数作用: 将HTTPClient库中的错误代码转换为对应的错误消息字符串。
- 函数参数:
error
:HTTPClient库中定义的错误代码。
- 返回值的作用: 返回表示错误消息的String对象。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); if (httpResponseCode < 0) {String errorMessage = HTTPClient::errorToString(httpResponseCode);Serial.println(errorMessage); }
void setCookieJar(CookieJar* cookieJar);
- 函数原型:
void setCookieJar(CookieJar* cookieJar);
- 函数作用: 设置用于管理HTTP请求和响应中Cookie的CookieJar对象。
- 函数参数:
cookieJar
:指向CookieJar对象的指针。
- 返回值的作用: 无返回值。
- 示例代码:
CookieJar cookieJar; HTTPClient http; http.setCookieJar(&cookieJar);
void resetCookieJar();
- 函数原型:
void resetCookieJar();
- 函数作用: 重置CookieJar,清除所有保存的Cookie。
- 函数参数: 无。
- 返回值的作用: 无返回值。
- 示例代码:
HTTPClient http; http.resetCookieJar();
void clearAllCookies();
- 函数原型:
void clearAllCookies();
- 函数作用: 清除所有保存的Cookie,无论它们是否过期。
- 函数参数: 无。
- 返回值的作用: 无返回值。
- 示例代码:
HTTPClient http; http.clearAllCookies();
总结
本文简要介绍了HTTP协议的基本概念及其在物联网设备中的常见应用。HTTP协议作为一种简单、灵活的通信协议,广泛应用于Web开发和物联网设备中。希望本文能帮助读者更好地理解HTTP协议及其在ESP32中的应用。
相关文章:
【史上最全面ESP32教程】http通信
文章目录 前言HTTP协议是什么?HTTP协议的特点HTTP协议的常见应用 esp32 使用http通信通信流程基础使用HTTPClient 常用的函数函数介绍:void end(void);bool connected(void);void setReuse(bool reuse);void setUserAgent(const String& userAgent);…...
*算法训练(leetcode)第二十七天 | 56. 合并区间、738. 单调递增的数字、968. 监控二叉树
刷题记录 56. 合并区间*738. 单调递增的数字*968. 监控二叉树 56. 合并区间 leetcode题目地址 排序后遇到有重合的区间选择最大的区间保存即可,结果集中保存的是离当前区间最近的区间,因此使用当前区间与结果集中的最后一个集合比较查看是否有重合&…...
OpenJudge 奇数求和
目录 描述思路样例输入样例输出CodeCC 总时间限制: 1000ms 内存限制: 65536kB 描述 计算非负整数 m 到 n(包括m 和 n )之间的所有奇数的和,其中,m 不大于 n,且n 不大于300。例如 m3, n12, 其和则为:357911…...

【排序 - 快速排序】
快速排序(Quick Sort)是一种高效的排序算法,它基于分治(Divide and Conquer)的策略。这种排序算法的核心思想是选择一个基准元素,将数组分割成两部分,使得左边的元素都小于等于基准元素…...

pytest使用报错(以及解决pytest所谓的“抑制print输出”)
1. 测试类的类名问题 #codingutf-8import pytestclass TestClass1:def setup(self) -> None:print(setup)def test_01(self) -> None:print(test_01111111111111111111111)def test_02(self) -> None:print(test_02)以上述代码为例,如果类名是Test开头&am…...
开源项目编译harbor arm架构的包 —— 筑梦之路
GitHub - amy5200/harbor-arm64 先做个记录,空了再验证...

[笔记] SKF Enveloping FAQ 用户指南
文档编号:Application Note CM3013 1.名词解释: 1.1cavitationWhat Is Cavitation? | Pumps & Systems 叶片在液体中扰动形成的超声波 1.2 stiff machinehttps://suspensionlist.com/the-pros-and-cons-of-stiff-vs-soft-suspension-systems/ …...
宪法学学习笔记(个人向) Part.3
宪法学学习笔记(个人向) Part 3 3. 国家基本制度 3.1 国家性质 3.1.1 国家性质概述 国家性质的概念 国家性质也称国体,或国家的阶级本质,是指各个阶级在国家中的地位(哪个阶层是统治阶层,哪个阶层是被统治阶层,哪个…...

联想拯救者Y7000 IRX9 笔记本接口功能介绍
适用机型:Legion Y7000 IRX9; 83JJ; USB(3.2 Gen 1)Type-接口摄像头开关组合音频插孔 多用于USB Type-C接口 以太网接口 多用途USB Type-C接口(支持USB Power Delivery)HDMI接口USB(3.2 Gen 1&…...

【ESP32】打造全网最强esp-idf基础教程——16.SmartConfig一键配网
SmartConfig一键配网 一、SmartConfig知识扫盲 在讲STA课程的时候,我们用的是代码里面固定的SSID和密码去连接热点,但实际应用中不可能这么弄,我们得有办法把家里的WiFi SSID和密码输入到设备里面去,对于带屏带输入设备还…...

MD5加密和注册页面的编写
MD5加密 1.导入包 npm install --save ts-md5 2.使用方式 import { Md5 } from ts-md5; //md5加密后的密码 const md5PwdMd5.hashStr("123456").toUpperCase(); 遇见的问题及用到的技术 注册页面 register.vue代码 <template><div class"wappe…...

【Android组件】封装加载弹框
📖封装加载弹框 ✅1. 构造LoadingDialog✅2. 调用LoadingDialog 效果: ✅1. 构造LoadingDialog 构造LoadingDialog类涉及到设计模式中的建造者模式,进行链式调用,注重的是构建的过程,设置需要的属性。 步骤一&#x…...

Spring源码二十:Bean实例化流程三
上一篇Spring源码十九:Bean实例化流程二中,我们主要讨论了单例Bean创建对象的主要方法getSingleton了解到了他的核心流程无非是:通过一个简单工厂的getObject方法来实例化bean,当然spring在实例化前后提供了扩展如:bef…...
前端导出文件时,后端代码出错如何将错误信息返回给前端展示
功能说明:前端导出excel时,后端出现异常,比如sql异常,或者创建excel时出现的异常,希望将这些异常信息返回给前端查看。 框架:vue3 axios Springboot 实现难度分析:前端导出excel,…...
解决Spring Boot应用中的内存优化问题
解决Spring Boot应用中的内存优化问题 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. Spring Boot应用的内存管理 在开发和部署Spring Boot应用时,有效地管理内存是确保应用性能和稳…...

shark云原生-日志体系-filebeat高级配置(适用于生产)-更新中
文章目录 1. filebeat.inputs 静态日志收集器2. filebeat.autodiscover 自动发现2.1. autodiscover 和 inputs2.2. 如何配置生效2.3. Providers 提供者2.4. Providers kubernetes2.5. 配置 templates2.5.1. kubernetes 自动发现事件中的变量字段2.5.2 配置 templates 2.6. 基于…...
响应式设计的双璧:WebKit 支持 CSS Flexbox 和 Grid 布局深度解析
响应式设计的双璧:WebKit 支持 CSS Flexbox 和 Grid 布局深度解析 在现代网页设计中,响应式布局是实现跨设备兼容性的关键。CSS Flexbox 和 Grid 作为 CSS 布局的两大支柱,提供了强大的工具来构建灵活和复杂的用户界面。WebKit,作…...

Linux软件包管理
一、软件包管理 1.什么是软件包 一般在window系统的.exe是软件按转包 2.linux系统下的软件包安装方式 PRM 软件包安装 软件名称.rpmYUM 包管理工具 yum intall 软件名称 -y源码安装 下载源代码---编译---安装 很麻烦,稳定 3.二进制软件包 二进制 4.获取*.rpm…...

如何分辨AI生成的内容?AI生成内容检测工具对比实验
检测人工智能生成的文本对各个领域的组织都提出了挑战,包括学术界和新闻界等。生成式AI与大语言模型根据短描述来进行内容生成的能力,产生了一个问题:这篇文章/内容/作业/图像到底是由人类创作的,还是AI创作的?虽然 LL…...

Clion中怎么切换不同的程序运行
如下图,比如这个文件夹下面有那么多的项目: 那么我想切换不同的项目运行怎么办呢?如果想通过下图的Edit Configurations来设置是不行的: 解决办法: 如下图,选中项目的CMakeLists.txt,右键再点击…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...

jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...

JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

边缘计算网关提升水产养殖尾水处理的远程运维效率
一、项目背景 随着水产养殖行业的快速发展,养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下,而且难以实现精准监控和管理。为了提升尾水处理的效果和效率,同时降低人力成本,某大型水产养殖企业决定…...