ESP32 HTTP GET и HTTP POST с Arduino IDE (JSON, URL Encoded, Text)
В этом руководстве вы узнаете, как выполнять HTTP GET и HTTP POST запросы на плате ESP32 с помощью Arduino IDE. Мы рассмотрим примеры получения значений, отправки JSON-объектов, URL-кодированных запросов и многое другое.
Рекомендуем: ESP8266 NodeMCU HTTP GET and HTTP POST with Arduino IDE (JSON, URL Encoded, Text)
Методы HTTP-запросов: GET и POST
Протокол передачи гипертекста (HTTP) работает как протокол «запрос-ответ» между клиентом и сервером. Вот пример:
ESP32 (клиент) отправляет HTTP-запрос к Raspberry Pi с Node-RED (сервер);
Сервер возвращает ответ ESP32 (клиенту);
Ответ содержит информацию о статусе запроса и может также содержать запрашиваемый контент.
HTTP GET
GET используется для запроса данных из указанного ресурса. Часто используется для получения значений из API.
Например, вы можете использовать:
GET /update-sensor?temperature=value1
Обратите внимание, что строка запроса (name = temperature и value = value1) отправляется в URL HTTP GET запроса.
Или вы можете использовать простой запрос для получения значения или 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 запроса. Однако, если они не зашифрованы, они все равно видны в теле запроса.)
HTTP GET/POST с ESP32
В этом руководстве мы рассмотрим следующие сценарии:
Необходимые условия
Перед началом работы с этим руководством убедитесь, что выполнены следующие предварительные условия.
Arduino IDE
Мы будем программировать ESP32 с помощью Arduino IDE, поэтому убедитесь, что у вас установлено дополнение ESP32.
Библиотека Arduino_JSON
Вам также необходимо установить библиотеку Arduino_JSON. Вы можете установить эту библиотеку через менеджер библиотек Arduino IDE. Просто перейдите в Sketch > Include Library > Manage Libraries и найдите библиотеку по имени:
Необходимые компоненты
Для этого руководства вам понадобятся следующие компоненты:
ESP32 (читайте Best ESP32 development boards)
Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Подготовка Node-RED (необязательно)
В качестве примера мы создадим веб-сервис на Raspberry Pi с Node-RED, который будет работать как веб-сервис (подобно API). По сути, вы будете отправлять HTTP GET и HTTP POST запросы к Raspberry Pi для получения значений или их обновления. Вы можете использовать любой другой веб-сервис.
Если у вас не установлен Node-RED, следуйте этим руководствам:
Запустив Node-RED на Raspberry Pi, перейдите по IP-адресу вашего Raspberry Pi с портом :1880.
http://raspberry-pi-ip-address:1880
Должен открыться интерфейс Node-RED. Вы можете просто импортировать готовый поток (flow):
Перейдите в 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 };\n\nreturn [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}]
Другие веб-сервисы или API
В этом руководстве ESP32 выполняет HTTP-запросы к Node-RED, но вы можете использовать эти примеры с другими сервисами, такими как ThingSpeak, IFTTT.com (сервис WebHooks), OpenWeatherMap.org, PHP сервер и т.д. Все примеры, представленные в этом руководстве, также будут работать с другими API.
Подводя итог, чтобы сделать это руководство совместимым с любым сервисом, вам нужно найти документацию API сервиса. Затем вам понадобится имя сервера (URL или IP-адрес) и параметры для отправки в запросе (путь URL или тело запроса). Наконец, измените наши примеры для интеграции с любым API, который вы хотите использовать.
1. ESP32 HTTP GET: значение или запрос в URL
В первом примере ESP32 выполнит HTTP GET запрос для обновления показания в сервисе. Этот тип запроса также можно использовать для фильтрации значения, запроса значения или получения JSON-объекта.
Код ESP32 HTTP GET с Arduino IDE
После установки необходимых дополнений для плат и библиотек, скопируйте следующий код в вашу Arduino IDE, но пока не загружайте его. Вам нужно внести некоторые изменения, чтобы он заработал.
/*
Rui Santos
Complete project details at Complete project details at https://RandomNerdTutorials.com/esp32-http-get-post-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
//Your Domain name with URL path or IP address with path
String serverName = "http://192.168.1.106:1880/update-sensor";
// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastTime = 0;
// Timer set to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Set timer to 5 seconds (5000)
unsigned long timerDelay = 5000;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
Serial.println("Timer set to 5 seconds (timerDelay variable), it will take 5 seconds before publishing the first reading.");
}
void loop() {
//Send an HTTP POST request every 10 minutes
if ((millis() - lastTime) > timerDelay) {
//Check WiFi connection status
if(WiFi.status()== WL_CONNECTED){
HTTPClient http;
String serverPath = serverName + "?temperature=24.37";
// Your Domain name with URL path or IP address with path
http.begin(serverPath.c_str());
// If you need Node-RED/server authentication, insert user and password below
//http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD");
// Send HTTP GET request
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);
}
// Free resources
http.end();
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
Настройка сетевых учетных данных
Измените следующие строки, указав ваши сетевые учетные данные: SSID и пароль. В коде есть комментарии, указывающие, где нужно внести изменения.
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Настройка serverName
Вам также необходимо указать ваше доменное имя или IP-адрес Node-RED, чтобы 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());
// If your need Node-RED/server authentication, insert user and password below
//http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD");
// Send HTTP GET request
int httpResponseCode = http.GET();
Примечание: если Node-RED требует аутентификации, раскомментируйте следующую строку и введите имя пользователя и пароль Node-RED.
// If you need Node-RED/server authentication, insert user and password below
//http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD");
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).
2. ESP32 HTTP GET: JSON-объект или простой текст
Следующий пример показывает, как выполнить HTTP GET запрос для получения JSON-объекта и его декодирования на ESP32. Многие API возвращают данные в формате JSON.
Скопируйте следующий скетч в вашу Arduino IDE (введите ваш SSID и пароль):
/*
Rui Santos
Complete project details at Complete project details at https://RandomNerdTutorials.com/esp32-http-get-post-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <WiFi.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
//Your Domain name with URL path or IP address with path
const char* serverName = "http://192.168.1.106:1880/get-sensor";
// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastTime = 0;
// Timer set to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Set timer to 5 seconds (5000)
unsigned long timerDelay = 5000;
String sensorReadings;
float sensorReadingsArr[3];
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
Serial.println("Timer set to 5 seconds (timerDelay variable), it will take 5 seconds before publishing the first reading.");
}
void loop() {
//Send an HTTP POST request every 10 minutes
if ((millis() - lastTime) > timerDelay) {
//Check WiFi connection status
if(WiFi.status()== WL_CONNECTED){
sensorReadings = httpGETRequest(serverName);
Serial.println(sensorReadings);
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]);
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
String httpGETRequest(const char* serverName) {
WiFiClient client;
HTTPClient http;
// Your Domain name with URL path or IP address with path
http.begin(client, serverName);
// If you need Node-RED/server authentication, insert user and password below
//http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD");
// 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;
}
Настройка serverName
Введите ваше доменное имя или IP-адрес Node-RED, чтобы 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);
// If you need Node-RED/server authentication, insert user and password below
//http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD");
// 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;
}
Примечание: если Node-RED требует аутентификации, раскомментируйте следующую строку и введите имя пользователя и пароль Node-RED.
// If you need Node-RED/server authentication, insert user and password below
//http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD");
Декодирование JSON-объекта
Для доступа к значениям декодируйте JSON-объект и сохраните все значения в массиве sensorReadingsArr.
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}
Затем декодированный JSON-объект выводится в монитор последовательного порта Arduino IDE.
Для целей отладки запрашиваемая информация также выводится в окне отладки Node-RED.
3. ESP32 HTTP POST: URL Encoded, JSON-объект, простой текст
Наконец, вы узнаете, как выполнить HTTP POST запрос с ESP32.
С помощью этого примера ваш ESP32 может выполнять HTTP POST запросы, используя три различных типа тела запроса: URL-кодированные данные, JSON-объект или простой текст. Это наиболее распространенные методы, которые должны работать с большинством API или веб-сервисов.
Скопируйте следующий скетч в вашу Arduino IDE (введите ваш SSID и пароль):
/*
Rui Santos
Complete project details at Complete project details at https://RandomNerdTutorials.com/esp32-http-get-post-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
//Your Domain name with URL path or IP address with path
const char* serverName = "http://192.168.1.106:1880/update-sensor";
// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastTime = 0;
// Timer set to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Set timer to 5 seconds (5000)
unsigned long timerDelay = 5000;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
Serial.println("Timer set to 5 seconds (timerDelay variable), it will take 5 seconds before publishing the first reading.");
}
void loop() {
//Send an HTTP POST request every 10 minutes
if ((millis() - lastTime) > timerDelay) {
//Check WiFi connection status
if(WiFi.status()== WL_CONNECTED){
WiFiClient client;
HTTPClient http;
// Your Domain name with URL path or IP address with path
http.begin(client, serverName);
// If you need Node-RED/server authentication, insert user and password below
//http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD");
// 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);
// If you need an HTTP request with a content type: application/json, use the following:
//http.addHeader("Content-Type", "application/json");
//int httpResponseCode = http.POST("{\"api_key\":\"tPmAT5Ab3j7F9\",\"sensor\":\"BME280\",\"value1\":\"24.25\",\"value2\":\"49.54\",\"value3\":\"1005.14\"}");
// If you need an HTTP request with a content type: text/plain
//http.addHeader("Content-Type", "text/plain");
//int httpResponseCode = http.POST("Hello, World!");
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
// Free resources
http.end();
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
Настройка serverName
Введите ваше доменное имя или IP-адрес Node-RED, чтобы ESP отправлял примерные показания датчиков.
String serverName = "http://192.168.1.106:1880/update-sensor";
Теперь загрузите код на вашу плату.
HTTP POST URL Encoded
Чтобы выполнить HTTP POST запрос типа URL encoded, как показано ниже:
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);
// If you need Node-RED/server authentication, insert user and password below
//http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD");
// 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);
Примечание: если Node-RED требует аутентификации, раскомментируйте следующую строку и введите имя пользователя и пароль Node-RED.
// If you need Node-RED/server authentication, insert user and password below
//http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD");
HTTP POST JSON-объект
Или, если вы предпочитаете выполнить HTTP POST запрос с JSON-объектом:
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 POST простой текст
Если вы хотите отправить простой текст или значение, используйте следующее:
http.addHeader("Content-Type", "text/plain");
int httpResponseCode = http.POST("Hello, World!");
Примечание: поток Node-RED, который мы используем (веб-сервис), не настроен для приема простого текста, но если API, с которым вы планируете интегрироваться, принимает только простой текст или значение, вы можете использовать приведенный выше фрагмент кода.
Демонстрация HTTP POST
В окне отладки Node-RED вы можете видеть, что ваш ESP выполняет HTTP POST запрос каждые 5 секунд.
И в этом примере эти значения также отправляются на 3 индикатора и отображаются на панели Node-RED Dashboard:
http://raspberry-pi-ip-address:1880/ui
Заключение
В этом руководстве вы узнали, как интегрировать ESP32 с онлайн-сервисами, используя HTTP GET и HTTP POST запросы.
HTTP GET и HTTP POST широко используются в большинстве веб-сервисов и API. Они могут быть полезны в ваших проектах для: публикации показаний датчиков в веб-сервис, такой как IFTTT, ThingSpeak; на веб-сервер ESP32 или Raspberry Pi или на ваш собственный сервер; для запроса данных из интернета или из вашей базы данных и многого другого.
Если вы используете плату ESP8266, читайте: Guide for ESP8266 NodeMCU HTTP GET and HTTP Post Requests.
Вам также может быть интересно:
Visualize Your Sensor Readings from Anywhere in the World (ESP32/ESP8266 + MySQL + PHP) using Charts
Надеемся, вам понравился этот проект. Если у вас есть вопросы, оставьте комментарий ниже, и мы постараемся ответить.
Источник: ESP32 HTTP GET and HTTP POST with Arduino IDE (JSON, URL Encoded, Text)