13. ESP32-HTTPClient(Arduino)

news2024/11/24 5:45:46

使用ESP32 Arduino框架的HTTPClient库进行HTTP请求

在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;
    
  2. 开始HTTP会话: 使用HTTPClient对象的begin()方法来指定你要访问的URL。这个URL可以是一个完整的URL,比如http://example.com/data,或者是一个IP地址,比如http://192.168.1.100/data

    http.begin("http://example.com/data");
    
  3. 选择HTTP方法: HTTP请求有多种方法,最常见的是GET和POST。GET方法用于从服务器获取数据,而POST方法用于向服务器发送数据。在这个例子中,我们使用GET方法获取数据。

    int httpResponseCode = http.GET();
    
  4. 处理响应: 一旦HTTP请求发送成功,服务器将会返回一个HTTP响应码。通常情况下,200表示成功。你可以使用http.GET()的返回值来获取响应码。

    if (httpResponseCode > 0) {
        // HTTP请求成功
    } else {
        // HTTP请求失败
    }
    
  5. 获取服务器响应: 如果HTTP请求成功,你可以使用http.getString()来获取服务器返回的数据。如果服务器返回的是JSON格式的数据,你可以使用ArduinoJson库的方法来解析它 关于ArduinoJson的详细内容可以看我的另一篇文章 ESP32-JSON(Arduino)。

    String payload = http.getString();
    
  6. 结束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);
    
  2. 设置请求头:

    http.addHeader("Content-Type", "application/json");
    

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

  3. 创建JSON请求体:

    StaticJsonDocument<200> jsonDoc;
    jsonDoc["key1"] = "value1";
    jsonDoc["key2"] = "value2";
    String requestBody;
    serializeJson(jsonDoc, requestBody);
    
  4. 发送POST请求并获取响应码:

    int httpResponseCode = http.POST(requestBody);
    
  5. 处理响应:

    if (httpResponseCode > 0) {
        String response = http.getString();
        // 解析并处理JSON响应
    } else {
        // 处理请求失败的情况
    }
    
  6. 解析JSON响应:

    StaticJsonDocument<200> responseJson;
    DeserializationError error = deserializeJson(responseJson, response);
    if (!error) {
        const char* value = responseJson["key"];
    }
    
  7. 结束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库文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1798203.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电子纸在日化行业的全新应用

电子纸在日化行业的全新应用 项目背景 在一日化龙头企业他们的洗衣粉产线在AGV小车取料到运输到产品包装工序时&#xff0c;因为取料粉车无明显区分标识&#xff0c;但是产品系列有十大类。在未采用晨控电子纸之前现场采用一个转盘分为十个区域&#xff0c;取料工序上方会有一…

2024-06-06 问AI: 在深度学习中,什么是欧几里德长度?

文心一言 在深度学习中&#xff0c;欧几里德长度&#xff08;也称为欧几里得距离或欧氏距离&#xff09;是一个常用的概念&#xff0c;它衡量的是在多维空间中两个点之间的真实距离&#xff0c;或者说是向量的自然长度&#xff08;即该点到原点的距离&#xff09;。以下是关于…

企业该如何选择GPU云服务器配置?

无论是个人开发者还是企业用户&#xff0c;对于如何选购最佳的云服务器配置&#xff0c;都是比较头疼与纠结的。因为GPU云服务器的配置众多&#xff0c;各种组合有各自优势与用途&#xff0c;很难一下子做出决策。接下来&#xff0c;我们来简单分析下各配置应该怎么选购。 1、地…

Linux C语言:指针和指针变量

一、指针的作用 使程序简洁、紧凑、高效有效地表示复杂的数据结构动态分配内存能直接访问硬件能够方便的处理字符串得到多于一个的函数返回值 二、内存、地址和变量 1、内存地址 2、变量和地址 1&#xff09;变量用来在程序中保存数据 比如: int k 58; //声明一个int变…

Dockershim 与 Containerd:两种容器运行时的故事

在不断发展的容器化世界中&#xff0c;两个关键组件经常被混淆&#xff1a;Dockershim 和 containerd。虽然它们在管理容器方面都发挥着重要作用&#xff0c;但它们的用途却截然不同。本文深入探讨了它们的功能&#xff0c;深入探讨了 Dockershim 和 containerd 之间的区别。 揭…

【前端】响应式布局笔记——自适应布局

自适应布局 自适应布局是不同设备对应不同的html(局部自适应)&#xff0c;通过判断设备的类型或控制局部的变化。 1、获取设备是移动端还是pc端 // 获取设备的信息let userAgent navigator.userAgent.toLowerCase();// 使用正则表达式来判断类型let device /ipad|iphone|m…

读书笔记分享

1.绝大多数父母都是爱孩子的&#xff0c;可他们却不是称职的父母。世界上任何职业都要培训、考核、竞争上岗&#xff0c;唯有“父母”这个职业是没有这些程序&#xff0c;只要生了小孩&#xff0c;就是天经地义的父母。 2.由于自身工作特点&#xff0c;“白领”们的部分器官和…

【Java数据结构】详解Stack与Queue(四)

&#x1f512;文章目录&#xff1a; 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2.用队列实现栈 3.用栈实现队列 4.栈和队列存放null 5.总结 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友…

计算机网络-NAT配置与ACL

目录 一、ACL 1、ACL概述 2、ACL的作用 3、ACL的分类 4、ACL的配置格式 二、NAT 1、NAT概述 2、NAT分类 2.1 、 静态NAT 2.2 、 动态NAT 3、NAT的功能 4、NAT的工作原理 三、NAT配置 1、静态NAT配置 2、动态NAT配置 四、总结 一、ACL 1、ACL概述 ACL&#xff…

微服务框架下,因发送端与消费端的vhost不一致,导致rabbitmq出现严重的消息堆积

一、背景 在生产环境下&#xff0c;rabbitmq机器出现磁盘空间不足的报警&#xff0c;发现是某个队列的消息只有生产&#xff0c;迟迟没有消费。 可以得到的信息是&#xff1a; 队列queue是data_center_file_change_queue队列绑定的交换机是resourceChangeExchange&#xff0c…

基于深度学习的CT影像肺癌检测识别

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 肺癌是全球范围内导致癌症死亡的主要原因之一&#xff0c;早期检测和诊断对于提高患者生存率至关重要。随着深度学习技术的迅猛发展&#xff0c;基于CT影像的肺癌检测识别成为了研究热点。本文介绍…

水库安全监测系统:智慧水文动态监测系统

TH-SW2水库安全监测系统&#xff0c;作为一款智慧水文动态监测系统&#xff0c;其在现代水利管理中扮演着至关重要的角色。该系统通过集成先进的数据采集、传输、处理和分析技术&#xff0c;为水库的安全运行提供了强有力的技术支撑。 水库安全监测系统是一种用于实时监测和记…

【案例分享】印前制版工单系统:“鹿山科技”助力“铭匠数据”重塑业务流程

内容概要 本文介绍了鹿山信息科技通过明道云HAP平台的数字化解决方案提升了铭匠数据在印前制版行业的效率。周口铭匠数据科技有限公司位于河南省周口市沈丘县&#xff0c;是一家专注于印前制版设计服务的公司&#xff0c;成立于2023年。企业在销售业务、版材制作生产和美工设计…

springboot编写简述01

项目结构 Users.java package com.sust.entity;import java.io.Serializable;public class Users implements Serializable {private String name;private String password;public String getName() {return name;}public void setName(String name) {this.name name;}publ…

探索Omega-3脂肪酸:健康益处与营养补充

谷禾健康 随着国家卫生健康委发布2024版食养指南&#xff0c;以及前几天在上海举办的临床医学与营养食品论坛&#xff0c;越来越多的人开始重视日常膳食的营养与健康。 而说到脂肪&#xff0c;很多人都会“谈脂色变”&#xff0c;想要避免脂肪的摄入&#xff0c;这其实是不正确…

神经网络 torch.nn---Pooling layers(nn.MaxPool2d)

torch.nn — PyTorch 2.3 documentation torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) nn.MaxPool2d class torch.nn.MaxPool2d(kernel_size, strideNone, padding0, dilation1, return_indicesFalse, ceil_modeFalse) 参数介绍 kernel_size(int or tuple) - …

宝兰德应用服务器软件通过保险业信息技术应用创新攻关实验室产品适配测试认证

近期&#xff0c;宝兰德中间件核心产品「应用服务器软件 V9.5.5」&#xff08;以下简称&#xff1a;应用服务器软件&#xff09;顺利通过了保险业信息技术应用创新攻关实验室产品适配测试。标志着宝兰德应用服务器软件符合信息技术产品适配要求&#xff0c;能够全面支持金融保险…

小华半导体MCU方案选型和应用

小华半导体有限公司是中国电子信息产业集团有限公司旗下集成电路业务平台华大半导体有限公司的核心子公司&#xff0c;目前团队规模约300人&#xff0c;其中75%以上为研发人员&#xff0c;国内细分行业规模最大&#xff0c;核心骨干拥有国际MCU大厂25年以上从业经验。 小华半导…

“墨者杯”网络安全大赛wp

漏洞利用01 504错误修改为POST提交拿到php源码&#xff0c; 查看逻辑$_POST[roam1] ! $_POST[roam2] && sha1($_POST[roam1]) sha1($_POST[roam2]) 采用数组绕过 roam1[]1&roam2[]2 拿到phpinfo&#xff0c;观察发现 这里的意思是每个php页面都包含这个f14…

C++基类与派生类

1.派生类的定义 派生类语法如下&#xff1a; class <派生类名> : <继承方式> <基类名> { private:派生类新增成员&#xff1b; protected:派生类新增成员&#xff1b; public:派生类新增成员&#xff1b; }; 说明&#xff1a; &#xff08;1&#xff09;cla…