问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

ESP32使用HTTPClient库进行HTTP请求详解

创作时间:
作者:
@小白创作中心

ESP32使用HTTPClient库进行HTTP请求详解

引用
CSDN
1.
https://blog.csdn.net/m0_60134435/article/details/139527001

在物联网和嵌入式开发领域,ESP32因其强大的功能和丰富的外设支持而广受欢迎。本文将详细介绍如何使用ESP32的Arduino框架中的HTTPClient库进行HTTP请求,包括GET和POST请求的完整示例。

在ESP32开发里,网络通信是挺重要的一部分,你可能需要从服务器拿数据啊,或者把传感器数据发到云端什么的。不过别担心,ESP32 Arduino框架给我们提供了HTTPClient库,让HTTP请求轻松简单。这篇文章就是来告诉你怎么在ESP32上利用HTTPClient库做HTTP请求的。

步骤一:包含必要的库

首先,在你的Arduino项目中,你需要包含HTTPClient库。打开Arduino IDE,点击顶部菜单栏中的"工具",然后选择"管理库"。在库管理器中搜索"HTTPClient",点击安装。

步骤二:初始化WiFi连接

在进行HTTP请求之前,需要确保ESP32已连接到WiFi网络。使用WiFi库来初始化WiFi连接,对WiFi库不了解的博友可以看一下这篇文章7. ESP32-WIFI(Arduino)。

#include <WiFi.h>
const char* ssid = "你的WiFi网络名称";
const char* password = "你的WiFi网络密码";
void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("正在连接到WiFi...");
    }
    Serial.println("已连接到WiFi网络");
}

步骤三:发起HTTP请求

一旦连接到WiFi网络,就可以使用HTTPClient库来发起HTTP请求了。

发起GET请求

下面是如何详细发起HTTP GET请求的:

  1. 创建HTTPClient对象:首先,你需要创建一个HTTPClient对象。这个对象将负责处理HTTP请求和响应。
HTTPClient http;
  1. 开始HTTP会话:使用HTTPClient对象的begin()方法来指定你要访问的URL。这个URL可以是一个完整的URL,比如http://example.com/data,或者是一个IP地址,比如http://192.168.1.100/data
http.begin("http://example.com/data");
  1. 选择HTTP方法:HTTP请求有多种方法,最常见的是GET和POST。GET方法用于从服务器获取数据,而POST方法用于向服务器发送数据。在这个例子中,我们使用GET方法获取数据。
int httpResponseCode = http.GET();
  1. 处理响应:一旦HTTP请求发送成功,服务器将会返回一个HTTP响应码。通常情况下,200表示成功。你可以使用http.GET()的返回值来获取响应码。
if (httpResponseCode > 0) {
    // HTTP请求成功
} else {
    // HTTP请求失败
}
  1. 获取服务器响应:如果HTTP请求成功,你可以使用http.getString()来获取服务器返回的数据。如果服务器返回的是JSON格式的数据,你可以使用ArduinoJson库的方法来解析它 关于ArduinoJson的详细内容可以看我的另一篇文章ESP32-JSON(Arduino)。
String payload = http.getString();
  1. 结束HTTP会话:当HTTP请求完成后,记得调用http.end()来结束HTTP会话,释放资源。
http.end();
#include <HTTPClient.h>
const char* serverURL = "http://example.com/data"; // 更换为你的服务器地址
void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("正在连接到WiFi...");
    }
    Serial.println("已连接到WiFi网络");
    HTTPClient http;
    Serial.print("正在发送HTTP GET请求到:");
    Serial.println(serverURL);
    http.begin(serverURL);
    int httpResponseCode = http.GET();
    if (httpResponseCode > 0) {
        Serial.print("HTTP响应码:");
        Serial.println(httpResponseCode);
        String payload = http.getString();
        Serial.println("服务器响应:");
        Serial.println(payload);
    } else {
        Serial.print("HTTP GET请求失败,错误码:");
        Serial.println(httpResponseCode);
    }
    http.end(); // 结束HTTP连接
}
void loop() {
    // 可选的其他代码
}

发起POST请求

不论是POST请求还是GET请求,大致步骤都是相同的。下面的示例展示了如何发送一个POST请求,并接收并解析服务器返回的JSON格式数据。

  1. 创建HTTPClient对象并初始化会话:
HTTPClient http;
http.begin(serverURL);
  1. 设置请求头:
http.addHeader("Content-Type", "application/json");

"Content-Type": "application/json"告诉服务器请求体的格式是JSON。

  1. 创建JSON请求体:
StaticJsonDocument<200> jsonDoc;
jsonDoc["key1"] = "value1";
jsonDoc["key2"] = "value2";
String requestBody;
serializeJson(jsonDoc, requestBody);
  1. 发送POST请求并获取响应码:
int httpResponseCode = http.POST(requestBody);
  1. 处理响应:
if (httpResponseCode > 0) {
    String response = http.getString();
    // 解析并处理JSON响应
} else {
    // 处理请求失败的情况
}
  1. 解析JSON响应:
StaticJsonDocument<200> responseJson;
DeserializationError error = deserializeJson(responseJson, response);
if (!error) {
    const char* value = responseJson["key"];
}
  1. 结束HTTP会话:
http.end();
const char* serverURL = "http://example.com/api"; // 替换为你的服务器地址
void sendPostRequest() {
    if (WiFi.status() == WL_CONNECTED) {
        HTTPClient http;
        http.begin(serverURL);
        http.addHeader("Content-Type", "application/json"); // 设置请求头
        // 创建JSON请求体
        StaticJsonDocument<200> jsonDoc;
        jsonDoc["key1"] = "value1";
        jsonDoc["key2"] = "value2";
        String requestBody;
        serializeJson(jsonDoc, requestBody);
        // 发送POST请求
        int httpResponseCode = http.POST(requestBody);
        if (httpResponseCode > 0) {
            String response = http.getString();
            Serial.print("HTTP响应码:");
            Serial.println(httpResponseCode);
            Serial.println("服务器响应:");
            Serial.println(response);
            // 解析服务器返回的JSON响应
            StaticJsonDocument<200> responseJson;
            DeserializationError error = deserializeJson(responseJson, response);
            if (error) {
                Serial.print("解析JSON失败:");
                Serial.println(error.c_str());
                return;
            }
            // 提取数据并存储
            const char* value = responseJson["key"]; // 根据JSON中的键提取值
            Serial.print("从服务器返回的值是:");
            Serial.println(value);
        } else {
            Serial.print("HTTP POST请求失败,错误码:");
            Serial.println(httpResponseCode);
        }
        http.end(); // 结束HTTP连接
    } else {
        Serial.println("WiFi未连接");
    }
}
void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("正在连接到WiFi...");
    }
    Serial.println("已连接到WiFi网络");
    // 发送POST请求
    sendPostRequest();
}
void loop() {
    // 可选的其他代码
}

结论

在ESP32 Arduino框架里,用HTTPClient库发HTTP请求超级简单又高效😄。就几个简单的步骤,你就能轻松地发起GET和POST请求,处理服务器的响应,连响应头和响应正文都能读📖。HTTPClient库特别灵活,再加上ArduinoJson库厉害的解析能力🔍,处理HTTP通信变得简直顺手无比👌。这招对物联网应用特别管用🌐,像远程数据收集、设备控制和数据传输之类的💪。

参考资料

  • ESP32 Arduino核心库
  • HTTPClient库文档
  • ArduinoJson库文档
  • ESP32 WiFi库文档
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号