ESP32 HTTP GET и HTTP POST с Arduino IDE (JSON, URL Encoded, Text)

В этом руководстве вы узнаете, как выполнять HTTP GET и HTTP POST запросы на плате ESP32 с помощью Arduino IDE. Мы рассмотрим примеры получения значений, отправки JSON-объектов, URL-кодированных запросов и многое другое.

ESP32 HTTP GET и HTTP POST с Arduino IDE (JSON, URL Encoded, Text)

Рекомендуем: 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

В этом руководстве мы рассмотрим следующие сценарии:

  1. ESP32 HTTP GET: значение или запрос в URL

  2. ESP32 HTTP GET: JSON-объект или простой текст

  3. ESP32 HTTP POST: URL Encoded, JSON-объект, простой текст

Необходимые условия

Перед началом работы с этим руководством убедитесь, что выполнены следующие предварительные условия.

Arduino IDE

Мы будем программировать ESP32 с помощью Arduino IDE, поэтому убедитесь, что у вас установлено дополнение ESP32.

Библиотека Arduino_JSON

Вам также необходимо установить библиотеку Arduino_JSON. Вы можете установить эту библиотеку через менеджер библиотек Arduino IDE. Просто перейдите в Sketch > Include Library > Manage Libraries и найдите библиотеку по имени:

Установка библиотеки Arduino JSON в Arduino IDE

Необходимые компоненты

Для этого руководства вам понадобятся следующие компоненты:

Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

MakerAdvisor

Подготовка 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):

Поток Node-RED для HTTP GET и POST запросов ESP32

Перейдите в 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-объекта.

HTTP GET ESP32 - получение значения датчика в виде простого текста

Код 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).

Отладочное окно Node-RED - HTTP GET значение

2. ESP32 HTTP GET: JSON-объект или простой текст

Следующий пример показывает, как выполнить HTTP GET запрос для получения JSON-объекта и его декодирования на ESP32. Многие API возвращают данные в формате JSON.

HTTP GET ESP32 - получение 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.

JSON данные в мониторе последовательного порта Arduino IDE

Для целей отладки запрашиваемая информация также выводится в окне отладки Node-RED.

Отладочное окно Node-RED - JSON объект

3. ESP32 HTTP POST: URL Encoded, JSON-объект, простой текст

Наконец, вы узнаете, как выполнить HTTP POST запрос с ESP32.

С помощью этого примера ваш ESP32 может выполнять HTTP POST запросы, используя три различных типа тела запроса: URL-кодированные данные, JSON-объект или простой текст. Это наиболее распространенные методы, которые должны работать с большинством API или веб-сервисов.

HTTP POST ESP32 - URL Encoded, 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>

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 секунд.

Отладочное окно Node-RED - HTTP POST значения

И в этом примере эти значения также отправляются на 3 индикатора и отображаются на панели Node-RED Dashboard:

http://raspberry-pi-ip-address:1880/ui
Панель Node-RED Dashboard с индикаторами температуры, влажности и давления

Заключение

В этом руководстве вы узнали, как интегрировать 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.

Вам также может быть интересно:

Надеемся, вам понравился этот проект. Если у вас есть вопросы, оставьте комментарий ниже, и мы постараемся ответить.


Источник: ESP32 HTTP GET and HTTP POST with Arduino IDE (JSON, URL Encoded, Text)