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

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

ESP8266 NodeMCU HTTP GET и HTTP POST с Arduino IDE JSON URL Encoded Text

Рекомендуем: ESP32 HTTP GET и HTTP POST с Arduino IDE (JSON, URL Encoded, Text)

Методы HTTP-запросов: GET и POST

Протокол передачи гипертекста (HTTP) работает как протокол запрос-ответ между клиентом и сервером. Вот пример:

  • ESP8266 (клиент) отправляет HTTP-запрос на Raspberry Pi с Node-RED (сервер);

  • Сервер возвращает ответ ESP8266 (клиенту);

  • Наконец, ответ содержит информацию о статусе запроса и может также содержать запрашиваемый контент.

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 с ESP8266

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

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

  2. ESP8266 HTTP GET: JSON-объект данных или простой текст

  3. ESP8266 HTTP POST: URL Encoded, JSON-объект данных, простой текст

Предварительные требования

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

Arduino IDE

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

Библиотека 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. Вы можете просто импортировать готовый поток:

Node-RED Flow HTTP GET POST Request Methods ESP32 ESP8266 Arduino

Перейдите в 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

В этом руководстве ESP8266 выполняет HTTP-запросы к Node-RED, но вы можете использовать эти примеры с другими сервисами, такими как ThingSpeak, IFTTT.com (сервис Web Hooks), OpenWeatherMap.org, PHP-сервер и т.д. Все примеры, представленные в этом руководстве, также будут работать с другими API.

В общем, чтобы сделать это руководство совместимым с любым сервисом, вам нужно найти документацию API сервиса. Затем вам нужно имя сервера (URL или IP-адрес) и параметры для отправки в запросе (путь URL или тело запроса). Наконец, измените наши примеры для интеграции с любым API, который вы хотите использовать.

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

В первом примере ESP8266 выполнит HTTP GET запрос для обновления показания в сервисе. Этот тип запроса также может использоваться для фильтрации значения, запроса значения или возврата JSON-объекта.

HTTP GET ESP8266 NodeMCU получение значения датчика простой текст статус 200 OK

Код ESP8266 HTTP GET с Arduino IDE

После установки необходимых дополнений и библиотек скопируйте следующий код в вашу Arduino IDE, но пока не загружайте его. Вам нужно внести некоторые изменения, чтобы он работал для вас.

/*
  Rui Santos
  Complete project details at Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-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.

  Code compatible with ESP8266 Boards Version 3.0.0 or above
  (see in Tools > Boards > Boards Manager > ESP8266)
*/

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.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 depending on timerDelay
  if ((millis() - lastTime) > timerDelay) {
    //Check WiFi connection status
    if(WiFi.status()== WL_CONNECTED){
      WiFiClient client;
      HTTPClient http;

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

      // Your Domain name with URL path or IP address with path
      http.begin(client, 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() вы фактически выполняете HTTP GET запрос каждые 5 секунд с примерными данными:

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

// Your Domain name with URL path or IP address with path
http.begin(client, 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();

Примечание: если 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");

ESP8266 выполняет новый запрос по следующему 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).

Обновление данных HTTP GET ESP8266 NodeMCU Arduino значение

2. ESP8266 HTTP GET: JSON-объект данных или простой текст

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

HTTP GET ESP8266 NodeMCU получение JSON данных датчика

Скопируйте следующий скетч в вашу Arduino IDE (укажите ваш SSID и пароль):

/*
  Rui Santos
  Complete project details at Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-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.

  Code compatible with ESP8266 Boards Version 3.0.0 or above
  (see in Tools > Boards > Boards Manager > ESP8266)
*/

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.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 depending on timerDelay
  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 IP address with path or Domain name with URL 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) {
  WiFiClient client;
  HTTPClient http;

  // Your IP address with path or Domain name with URL 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;
}

Примечание: если 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 Data object HTTP POST Request Method

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

Обновление данных HTTP GET ESP8266 NodeMCU Arduino JSON объект

3. ESP8266 HTTP POST: URL Encoded, JSON-объект данных, простой текст

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

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

HTTP POST ESP8266 NodeMCU URL Encoded JSON Object Data Plain Text

Скопируйте следующий скетч в вашу Arduino IDE (укажите ваш SSID и пароль):

/*
  Rui Santos
  Complete project details at Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-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.

  Code compatible with ESP8266 Boards Version 3.0.0 or above
  (see in Tools > Boards > Boards Manager > ESP8266)
*/

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.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-кодированного, например:

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

Примечание: если 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 простой текст

Если вы хотите отправить простой текст или значение, используйте следующее:

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

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

Примечание: поток Node-RED, который мы используем (веб-сервис), не настроен для получения простого текста, но если API, с которым вы планируете интегрироваться, принимает только простой текст или значение, вы можете использовать предыдущий фрагмент.

Демонстрация HTTP POST

В окне отладки Node-RED вы можете видеть, что ваш ESP выполняет HTTP POST запрос каждые 5 секунд.

Обновление данных HTTP POST ESP8266 NodeMCU Arduino значение

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

http://raspberry-pi-ip-address:1880/ui
ESP32 ESP8266 HTTP GET POST демонстрация

Заключение

В этом руководстве вы узнали, как интегрировать ваш ESP8266 с онлайн-сервисами, используя HTTP GET и HTTP POST запросы.

HTTP GET и HTTP POST широко используются в большинстве веб-сервисов и API. Они могут быть полезны в ваших проектах для: публикации показаний датчиков в веб-сервис, такой как IFTTT, ThingSpeak; на веб-сервер ESP8266 или Raspberry Pi, или на ваш собственный сервер; для запроса данных из интернета или из вашей базы данных, и многого другого.

Если вы используете плату ESP32, читайте: Руководство по ESP32 HTTP GET и HTTP POST запросам.

Вам также может понравиться:

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

Если вам нравится ESP8266, вы можете рассмотреть возможность приобретения нашей книги «Домашняя автоматизация с использованием ESP8266». Вы также можете получить доступ к нашим бесплатным ресурсам по ESP8266 здесь.

Спасибо за чтение.