ESP8266 NodeMCU HTTP GET и HTTP POST с Arduino IDE (JSON, URL Encoded, Text)
В этом руководстве вы узнаете, как выполнять HTTP GET и HTTP POST запросы с платой ESP8266 NodeMCU, используя Arduino IDE. Мы рассмотрим примеры получения значений, отправки JSON-объектов, URL-кодированных запросов и многого другого.
Рекомендуем: 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
В этом руководстве мы рассмотрим следующие сценарии:
Предварительные требования
Перед тем как приступить к этому руководству, убедитесь, что вы выполнили следующие предварительные условия.
Arduino IDE
Мы будем программировать плату ESP8266 NodeMCU с помощью Arduino IDE, поэтому убедитесь, что у вас установлено дополнение ESP8266.
Библиотека Arduino_JSON
Вам также необходимо установить библиотеку Arduino_JSON. Вы можете установить эту библиотеку в менеджере библиотек Arduino IDE. Просто перейдите в Sketch > Include Library > Manage Libraries и найдите библиотеку по имени:
Необходимые компоненты
Для этого руководства вам понадобятся следующие компоненты:
ESP8266 (читайте Лучшие платы разработки ESP8266)
Плата Raspberry Pi (читайте Лучшие стартовые наборы Raspberry Pi)
Вы можете использовать ссылки выше или перейти напрямую на 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. Вы можете просто импортировать готовый поток:
Перейдите в 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-объекта.
Код 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).
2. ESP8266 HTTP GET: JSON-объект данных или простой текст
Следующий пример показывает, как выполнить HTTP GET запрос для получения JSON-объекта и его декодирования с помощью ESP8266. Многие API возвращают данные в формате 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.
Для целей отладки запрашиваемая информация также выводится в окне отладки Node-RED.
3. ESP8266 HTTP POST: URL Encoded, JSON-объект данных, простой текст
Наконец, вы узнаете, как выполнить HTTP POST запрос с помощью ESP8266.
В этом примере ваш ESP8266 может выполнять HTTP POST запросы с использованием трёх различных типов тела запроса: URL-кодированного, JSON-объекта или простого текста. Это наиболее распространённые методы, которые должны интегрироваться с большинством API или веб-сервисов.
Скопируйте следующий скетч в вашу 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 секунд.
И в этом примере эти значения также отправляются на 3 индикатора (Gauge) и отображаются в Node-RED Dashboard:
http://raspberry-pi-ip-address:1880/ui
Заключение
В этом руководстве вы узнали, как интегрировать ваш ESP8266 с онлайн-сервисами, используя HTTP GET и HTTP POST запросы.
HTTP GET и HTTP POST широко используются в большинстве веб-сервисов и API. Они могут быть полезны в ваших проектах для: публикации показаний датчиков в веб-сервис, такой как IFTTT, ThingSpeak; на веб-сервер ESP8266 или Raspberry Pi, или на ваш собственный сервер; для запроса данных из интернета или из вашей базы данных, и многого другого.
Если вы используете плату ESP32, читайте: Руководство по ESP32 HTTP GET и HTTP POST запросам.
Вам также может понравиться:
ESP32/ESP8266 Отправка email-уведомлений с помощью PHP скрипта
Визуализация показаний датчиков из любой точки мира (ESP32/ESP8266 + MySQL + PHP) с помощью графиков
Надеемся, вам понравился этот проект. Если у вас есть вопросы, оставьте комментарий ниже, и мы постараемся ответить вам.
Если вам нравится ESP8266, вы можете рассмотреть возможность приобретения нашей книги «Домашняя автоматизация с использованием ESP8266». Вы также можете получить доступ к нашим бесплатным ресурсам по ESP8266 здесь.
Спасибо за чтение.