ESP32 HTTP GET 和 HTTP POST 使用教程(JSON、URL Encoded、文本)

释放双眼,带上耳机,听听看~!

在本指南中,您将学习如何使用带有 Arduino IDE 的 ESP32 板发出 HTTP GET 和 HTTP POST 请求。我们将介绍有关如何获取值、发布 JSON 对象、URL 编码请求等的示例。

ESP32 HTTP GET 和 HTTP POST 使用教程(JSON、URL Encoded、文本)

HTTP 请求方法:GET 与 POST

超文本传输​​协议 (HTTP) 用作客户端和服务器之间的请求-响应协议。这是一个例子:

  • ESP32(客户端)向运行 Node-RED(服务器)的 Raspberry Pi 提交 HTTP 请求;
  • 服务器向 ESP32(客户端)返回响应;
  • 最后,响应包含有关请求的状态信息,也可能包含请求的内容。

HTTP 获取

GET用于从指定资源请求数据。它通常用于从 API 获取值。

例如,您可以使用:

GET /update-sensor?temperature=value1

请注意,查询字符串(name = temperature和value = value1)在 HTTP GET 请求的 URL 中发送。

或者你可以使用一个简单的请求来返回一个值或 JSON 对象,例如:

GET /get-sensor

(使用 HTTP GET,URL 请求中的每个人都可以看到数据。)

HTTP POST

POST用于将数据发送到服务器以创建/更新资源。例如,将传感器读数发布到服务器。

使用 POST 发送到服务器的数据存储在 HTTP 请求的请求正文中:

POST /update-sensor HTTP/1.1
Host: example.com
api_key=api&sensor_name=name&temperature=value1&humidity=value2&pressure=value3
Content-Type: application/x-www-form-urlencoded

在正文请求中,您还可以发送一个 JSON 对象:

POST /update-sensor HTTP/1.1
Host: example.com
{api_key: "api", sensor_name: "name", temperature: value1, humidity: value2, pressure: value3}
Content-Type: application/json

(使用 HTTP POST,数据在 URL 请求中是不可见的。但是,如果它没有加密,它仍然在请求正文中可见。)

使用 ESP32 的 HTTP GET/POST

在本指南中,我们将探讨以下场景:

  1. ESP32 HTTP GET:URL 中的值或查询
  2. ESP32 HTTP GET:JSON 数据对象或纯文本
  3. ESP32 HTTP POST:URL 编码、JSON 数据对象、纯文本

先决条件

在继续本教程之前,请确保完成以下先决条件。

  • 已在Arduino IDE安装ESP32环境

Arduino_JSON 库

您还需要安装 Arduino_JSON 库。您可以在 Arduino IDE 库管理器中安装此库。只需转到 Sketch  >  Include Library  >  Manage Libraries 并搜索库名称,如下所示:

ESP32 HTTP GET 和 HTTP POST 使用教程(JSON、URL Encoded、文本)

所需零件

对于本教程,您需要以下部分:

  • ESP32
  • Raspberry Pi 板 或者有自己的服务器或本地服务器
  • MicroSD 卡 – 16GB Class10
  • 树莓派电源 (5V 2.5A)
  • 连接线
  • 面包板

准备 Node-RED(可选)

例如,我们将使用 Raspberry Pi 和 Node-RED 创建一个 Web 服务,以充当 Web 服务(如 API)。基本上,您将向 Raspberry Pi 发出 HTTP GET 和 HTTP POST 请求以获取值或更新它们。您可以使用任何其它网络服务。

如果您没有安装 Node-RED,请进入官网查找相关教程安装:https://nodered.org/

在您的 Raspberry Pi 上运行 Node-RED,转到您的 Raspberry Pi IP 地址,端口:1880。

http://raspberry-pi-ip-address:1880

Node-RED 界面应该打开。您可以简单地导入最终流程:

ESP32 HTTP GET 和 HTTP POST 使用教程(JSON、URL Encoded、文本)

转到Menu > Import并将以下内容复制到剪贴板以创建 Node-RED 流。

 [{"id":"599740b7.efde9","type":"http response","z":"b01416d3.f69f38","name":"","statusCode":"200","headers":{},"x":420,"y":689,"wires":[]},{"id":"1618a829.76f638","type":"json","z":"b01416d3.f69f38","name":"","property":"payload","action":"obj","pretty":true,"x":410,"y":809,"wires":[["d0089cc7.d25ac"]]},{"id":"c7410fa2.1c2fa","type":"debug","z":"b01416d3.f69f38","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":850,"y":709,"wires":[]},{"id":"75a22f74.f1aba","type":"ui_text","z":"b01416d3.f69f38","group":"2b7ac01b.fc984","order":1,"width":0,"height":0,"name":"","label":"Sensor Name","format":"msg.payload","layout":"row-spread","x":860,"y":769,"wires":[]},{"id":"1c8f9093.8bc2bf","type":"ui_gauge","z":"b01416d3.f69f38","name":"","group":"2b7ac01b.fc984","order":2,"width":0,"height":0,"gtype":"gage","title":"Temperature","label":"ºC","format":"value","min":0,"max":"38","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":850,"y":829,"wires":[]},{"id":"a5bd2706.54e108","type":"ui_gauge","z":"b01416d3.f69f38","name":"","group":"2b7ac01b.fc984","order":3,"width":0,"height":0,"gtype":"gage","title":"Humidity","label":"%","format":"value","min":0,"max":"100","colors":["#0080ff","#0062c4","#002f5e"],"seg1":"","seg2":"","x":840,"y":889,"wires":[]},{"id":"105ac2cc.7b3cfd","type":"ui_gauge","z":"b01416d3.f69f38","name":"","group":"2b7ac01b.fc984","order":4,"width":0,"height":0,"gtype":"gage","title":"Pressure","label":"hPa","format":"value","min":0,"max":"1200","colors":["#b366ff","#8000ff","#440088"],"seg1":"","seg2":"","x":840,"y":949,"wires":[]},{"id":"d0089cc7.d25ac","type":"function","z":"b01416d3.f69f38","name":"JSON or URL Encoded","func":"var msg0 = { payload: msg.payload.api_key };nvar msg1 = { payload: msg.payload.sensor };nvar msg2 = { payload: msg.payload.value1 };nvar msg3 = { payload: msg.payload.value2 };nvar msg4 = { payload: msg.payload.value3 };nnreturn [msg0, msg1, msg2, msg3, msg4];","outputs":5,"noerr":0,"x":610,"y":809,"wires":[["c7410fa2.1c2fa"],["75a22f74.f1aba"],["1c8f9093.8bc2bf"],["a5bd2706.54e108"],["105ac2cc.7b3cfd"]]},{"id":"5d9ab0d2.66b92","type":"http in","z":"b01416d3.f69f38","name":"","url":"update-sensor","method":"post","upload":false,"swaggerDoc":"","x":200,"y":740,"wires":[["599740b7.efde9","c7410fa2.1c2fa","1618a829.76f638"]]},{"id":"7f5cf345.63f56c","type":"http response","z":"b01416d3.f69f38","name":"","statusCode":"200","headers":{},"x":540,"y":420,"wires":[]},{"id":"6530621.95b429c","type":"http in","z":"b01416d3.f69f38","name":"","url":"/get-sensor","method":"get","upload":false,"swaggerDoc":"","x":180,"y":600,"wires":[["9471d1a0.68588"]]},{"id":"5ddc9f47.4b555","type":"http response","z":"b01416d3.f69f38","name":"","statusCode":"200","headers":{},"x":540,"y":560,"wires":[]},{"id":"9471d1a0.68588","type":"function","z":"b01416d3.f69f38","name":"","func":"msg.payload = {"value1":24.25, "value2":49.54, "value3":1005.14};nreturn msg;","outputs":1,"noerr":0,"x":350,"y":600,"wires":[["5ddc9f47.4b555","13aea59.7430e5a"]]},{"id":"13aea59.7430e5a","type":"debug","z":"b01416d3.f69f38","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":550,"y":628,"wires":[]},{"id":"e71c7a7d.e7c598","type":"debug","z":"b01416d3.f69f38","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":550,"y":500,"wires":[]},{"id":"c7807102.3f433","type":"http in","z":"b01416d3.f69f38","name":"","url":"/update-sensor","method":"get","upload":false,"swaggerDoc":"","x":190,"y":460,"wires":[["60410cde.562a34"]]},{"id":"60410cde.562a34","type":"function","z":"b01416d3.f69f38","name":"","func":"msg.payload = msg.payload.temperature;nreturn msg;","outputs":1,"noerr":0,"x":390,"y":460,"wires":[["e71c7a7d.e7c598","7f5cf345.63f56c"]]},{"id":"2b7ac01b.fc984","type":"ui_group","z":"","name":"SENSORS","tab":"99ab8dc5.f435c","disp":true,"width":"6","collapse":false},{"id":"99ab8dc5.f435c","type":"ui_tab","z":"","name":"HTTP","icon":"dashboard","order":1,"disabled":false,"hidden":false}]

其它 Web 服务或 API

在本教程中,ESP32 向 Node-RED 执行 HTTP 请求,除此以外,各位如果会搭建本地php环境的,也可以自己搞个php环境写个api接口。当然,也可以和网上的其它 API 一起使用。

总之,要让本教程兼容任何服务,您需要搜索服务 API 文档。然后,您需要服务器名称(URL 或 IP 地址)以及要在请求中发送的参数(URL 路径或请求正文)。最后,修改我们的示例以与您要使用的任何 API 集成。

1. ESP32 HTTP GET:URL 中的值或查询

在第一个示例中,ESP32 将发出 HTTP GET 请求以更新服务中的读数。这种类型的请求也可用于过滤值、请求值或返回 JSON 对象。

ESP32 HTTP GET 和 HTTP POST 使用教程(JSON、URL Encoded、文本)

使用 Arduino IDE 编码 ESP32 HTTP GET

安装必要库后,将以下代码复制到您的 Arduino IDE,但不要上传,还需要进行一些更改:

设置您的网络凭据

使用您的网络凭据修改下一行:SSID 和密码。该代码对您应该在哪里进行更改进行了很好的注释。

// Replace with your network credentials
const char* ssid     = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

设置你的 serverName

您还需要输入您的域名或 Node-RED IP 地址,以便 ESP 将读数发布到您自己的服务器。

String serverName = "http://192.168.1.106:1880/update-sensor";

现在,将代码上传到您的板上,它应该可以立即工作。

如果您想了解如何发出 HTTP GET 请求,请阅读下一节。

HTTP GET 请求

在函数 loop() 里面是您实际每 5 秒使用示例数据发出 HTTP GET 请求:

String serverPath = serverName + "?temperature=24.37";

// Your Domain name with URL path or IP address with path
http.begin(serverPath.c_str());

// Send HTTP GET request
int httpResponseCode = http.GET();

ESP32 在以下 URL 中发出新请求,以使用新温度更新传感器字段:

http://192.168.1.106:1880/update-sensor?temperature=24.37

然后,以下代码行保存来自服务器的 HTTP 响应。

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);
}

示范

在您的电路板运行新程序后,打开 Node-RED 调试窗口。您将看到示例值已成功打印 (24.37)。

ESP32 HTTP GET 和 HTTP POST 使用教程(JSON、URL Encoded、文本)

2. ESP32 HTTP GET:JSON 数据对象或纯文本

下一个示例展示了如何发出 HTTP GET 请求以获取 JSON 对象并使用 ESP32 对其进行解码。许多 API 以 JSON 格式返回数据。

ESP32 HTTP GET 和 HTTP POST 使用教程(JSON、URL Encoded、文本)

将下一个程序复制到您的 Arduino IDE(输入您的 SSID 和密码):

设置你的 serverName

输入您的域名或 Node-RED IP 地址,以便 ESP 请求将在 JSON 对象中检索的传感器读数。

String serverName = "http://192.168.1.106:1880/get-sensor";

现在,将代码上传到您的板上。

HTTP GET 请求(JSON 对象)

在函数 loop() 里面,调用httpGETRequest()发出 HTTP GET 请求的函数:

sensorReadings = httpGETRequest(serverName);

这httpGETRequest()函数向 Node-RED 地址http://192.168.1.106:1880/get-sensor发出请求,并检索带有 JSON 对象的字符串。

String httpGETRequest(const char* serverName) {
  HTTPClient http;

  // Your IP address with path or Domain name with URL path 
  http.begin(serverName);

  // Send HTTP POST request
  int httpResponseCode = http.GET();

  String payload = "{}"; 

  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http.getString();
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  // Free resources
  http.end();

  return payload;
}

解码 JSON 对象

要访问这些值,请解码 JSON 对象并将所有值存储在传感器读数Arr数组。

JSONVar myObject = JSON.parse(sensorReadings);

// JSON.typeof(jsonVar) can be used to get the type of the var
if (JSON.typeof(myObject) == "undefined") {
  Serial.println("Parsing input failed!");
  return;
}

Serial.print("JSON object = ");
Serial.println(myObject);

// myObject.keys() can be used to get an array of all the keys in the object
JSONVar keys = myObject.keys();

for (int i = 0; i < keys.length(); i++) {
  JSONVar value = myObject[keys[i]];
  Serial.print(keys[i]);
  Serial.print(" = ");
  Serial.println(value);
  sensorReadingsArr[i] = double(value);
}
Serial.print("1 = ");
Serial.println(sensorReadingsArr[0]);
Serial.print("2 = ");
Serial.println(sensorReadingsArr[1]);
Serial.print("3 = ");
Serial.println(sensorReadingsArr[2]);

HTTP GET 演示

上传代码后,打开 Arduino IDE,您会看到它正在接收以下 JSON 数据:

{"value1":24.25,"value2":49.54,"value3":1005.14}

然后,在 Arduino IDE 串行监视器中打印解码的 JSON 对象。

ESP32 HTTP GET 和 HTTP POST 使用教程(JSON、URL Encoded、文本)

出于调试目的,请求的信息也会打印在 Node-RED 调试窗口中。

ESP32 HTTP GET 和 HTTP POST 使用教程(JSON、URL Encoded、文本)

3. ESP32 HTTP POST:URL 编码、JSON 数据对象、纯文本

最后,您将学习如何使用 ESP32 发出 HTTP POST 请求。

通过这个示例,您的 ESP32 可以使用三种不同类型的正文请求发出 HTTP POST 请求:URL 编码、JSON 对象或纯文本。这些是最常用的方法,应该与大多数 API 或 Web 服务集成。

ESP32 HTTP GET 和 HTTP POST 使用教程(JSON、URL Encoded、文本)

将下一个程序复制到您的 Arduino IDE(输入您的 SSID 和密码):

设置你的 serverName

输入您的域名或 Node-RED IP 地址,以便 ESP 发布示例传感器读数。

String serverName = "http://192.168.1.106:1880/update-sensor";

现在,将代码上传到您的板上。

HTTP POST URL 编码

发出 URL 编码类型的 HTTP POST 请求,如下所示

POST /update-sensor HTTP/1.1
Host: 192.168.1.106:1880
api_key=tPmAT5Ab3j7F9&sensor=BME280&value1=24.25&value2=49.54&value3=1005.14
Content-Type: application/x-www-form-urlencoded

您需要在 Arduino 代码中运行以下命令:

// Your Domain name with URL path or IP address with path
http.begin(serverName);

// Specify content-type header
http.addHeader("Content-Type", "application/x-www-form-urlencoded");

// Data to send with HTTP POST
String httpRequestData = "api_key=tPmAT5Ab3j7F9&sensor=BME280&value1=24.25&value2=49.54&value3=1005.14";

// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);

HTTP POST JSON 对象

或者,如果您更喜欢使用 JSON 对象发出 HTTP POST 请求:

POST /update-sensor HTTP/1.1
Host: example.com
{api_key: "tPmAT5Ab3j7F9", sensor_name: "BME280", temperature: 24.25; humidity: 49.54; pressure: 1005.14}
Content-Type: application/json

使用下一个片段:

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

int httpResponseCode = http.POST("{"api_key":"tPmAT5Ab3j7F9","sensor":"BME280","value1":"24.25","value2":"49.54","value3":"1005.14"}");
HTTP 纯文本

如果要发送纯文本或值,请使用以下命令:

http.addHeader("Content-Type", "text/plain");

int httpResponseCode = http.POST("Hello, World!");

注意:我们使用的 Node-RED 流程(Web 服务)未undefined为接收纯文本,但如果您计划集成的 API 只接受纯文本或值,您可以使用前面的代码段。

HTTP POST 演示

在 Node-RED 调试窗口中,您可以查看您的 ESP 每 5 秒发出一次 HTTP POST 请求。

ESP32 HTTP GET 和 HTTP POST 使用教程(JSON、URL Encoded、文本)

在本例中,这些值也被发送到 3 个仪表并显示在 Node-RED 仪表板中:

http://raspberry-pi-ip-address:1880/ui
ESP32 HTTP GET 和 HTTP POST 使用教程(JSON、URL Encoded、文本)

总结

在本教程中,您学习了如何使用 HTTP GET 和 HTTP POST 请求将 ESP32 与在线api服务集成。

HTTP GET 和 HTTP POST 常用于大多数 Web 服务和 API。这些对您的项目很有用: 将传感器读数发布到 Web 服务,到 Raspberry Pi Web 服务器或您自己的服务器;从 Internet 或您的数据库中请求数据等等。

 

给TA打赏
共{{data.count}}人
人已打赏
免费项目

ESP32 带 SIM800L GSM/GPRS开发板介绍

2022-8-30 23:51:04

免费项目

物联网智能家居:ESP8266 WiFi 5V 1通道继电器控制

2022-9-3 20:57:57

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
'); })();