ESP8266 уроки. HTTP-запрос POST

Разработка проектов под заказ

Цель этого урока - объяснить, как выполнять запросы POST от ESP8266, используя Arduino IDE и библиотеки ESP8266. Все показанные здесь тесты, были выполнены на плате NodeMCU.

Для данного урока нужно подключить некоторые библиотеки, которые должны быть доступны после установки поддержки ESP8266 в среде Arduino IDE.

Нам понадобится ESP8266WiFi.h, чтобы была возможность подключить ESP8266 к сети Wi-Fi, и ESP8266HTTPClient.h, который делает доступными методы, необходимые для выполнения запроса POST.

#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>

В функции setup() Arduino начнем с инициализации последовательного соединения, чтобы была возможность вывести результаты нашей программы.

Serial.begin(115200);

После этого позаботимся о подключении ESP8266 к сети Wi-Fi, чтобы позже мы могли отправить HTTP-запрос. Для этого нужно только вызвать метод begin для переменной WiFi, передав в качестве первого значения, имя сети (SSID), а второй параметр - пароль.

WiFi.begin(ssid, password);

Внимание, используйте учетные данные вашей сети.

Подробное руководство о том, как подключить ESP8266 к сети Wi-Fi, можно прочитать здесь.

Чтобы завершить настройку, будем опрашивать статус WiFi-соединения, пока оно не будет установлено. Для простоты используем здесь метод опроса, так как начать выполнение HTTP-запросов POST можно только после того, как будет установлено соединение с сетью Wi-Fi. Естественно, в реальном приложении мы должны учитывать, что при попытке подключения к сети могут возникнуть некоторые проблемы.

Полная настройка приведена ниже.

#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>

const char* ssid = "yourSSID";
const char* password = "yourPASS";
byte tries = 10;  // Попыткок подключения к точке доступа

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (--tries && WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  if (WiFi.status() != WL_CONNECTED)
  {
    Serial.println("Non Connecting to WiFi..");
  }
  else
  {
    // Иначе удалось подключиться отправляем сообщение
    // о подключении и выводим адрес IP
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  }
}

Описание кода HTTP-запросы POST.

В этом разделе проанализируем код, выполняемый в функции основного цикла Arduino для выполнения запроса HTTP POST. Будем разбивать код на части и анализировать его шаг за шагом, но окончательный результат подведен в конце этого раздела.

Прежде всего, нам нужно определить объект класса HTTPClient, из которого будем вызывать различные методы для подготовки заголовков и содержимого запроса, отправки его и проверки результата. Будем называть этот объект просто «http».

HTTPClient http;

После этого вызовем метод begin для объекта http и передадим URL-адрес, к которому мы хотим подключиться, и сделаем запрос HTTP POST. В этом случае я отправляю запрос на веб-сайт, указав его доменное имя, как показано ниже (целевой веб-сайт, используемый во фрагменте кода, реализует фиктивный REST API для тестирования и прототипирования).

http.begin("http://jsonplaceholder.typicode.com/users");

Затем можем определить заголовок для запроса с помощью метода addHeader. В этом случае указываем тип содержимого как «text/plain», поскольку мы просто отправим простую строку в теле.

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

Тело запроса указывается в качестве параметра при вызове метода POST для объекта HTTPClient. В этом случае просто отправим строку «Message from ESP8266». Возвращаемое значение этого метода соответствует коду ответа HTTP, поэтому важно проверить обработку ошибок.

Учтите, что если значение больше 0, оно соответствует стандартному коду HTTP. Если это значение меньше 0, это соответствует ошибке ESP8266, связанной с подключением. Вы можете проверить список возможных ошибок здесь.

int httpCode = http.POST("Message from ESP8266");

Теперь можем получить полезную нагрузку, вызвав метод getString, который вернет информацию ответа в виде строки.

String payload = http.getString();

Выведем полезную нагрузку и код HTTP в монитор порта.

Serial.println(httpCode);
Serial.println(payload);

В завершение нам нужно вызвать метод end объекта http, чтобы гарантировать закрытие TCP-соединения. Это очень важно для освобождения ресурсов.

http.end();

Полный код показан ниже. В скетч добавим 30-секундную задержку между каждым выполнение цикла Arduino, чтобы избежать постоянного опроса сервера.

Обратите внимание, что для упрощения кода и сосредоточения внимания на основной теме отправки запроса HTTP POST мы не проверяли, меньше ли значение переменной httpCode нуля, что указывает на ошибку в соединении. Тем не менее, мы должны сделать это в окончательном коде приложения.

#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>

const char* ssid = "yourSSID";
const char* password = "yourPASS";
byte tries = 10;  // Попыткок подключения к точке доступа

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (--tries && WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  if (WiFi.status() != WL_CONNECTED)
  {
    Serial.println("Non Connecting to WiFi..");
  }
  else
  {
    // Иначе удалось подключиться отправляем сообщение
    // о подключении и выводим адрес IP
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  }
}

void loop() {

  HTTPClient http;    //Объявить объект класса HttpClient

  http.begin("http://jsonplaceholder.typicode.com/users");      //Укажите адрес запроса
  http.addHeader("Content-Type", "text/plain");  //Укажите заголовок типа содержимого

  int httpCode = http.POST("Message from ESP8266");   //Отправьте запрос
  String payload = http.getString();                  //Получите полезную нагрузку ответа

  Serial.println(httpCode);   //Распечатать код возврата HTTP
  Serial.println(payload);    //Полезная нагрузка для ответа на запрос печати

  http.end();  //Закрыть соединение


  delay(30000);  //Ждем 30 сек.

}

Тестирование кода POST запроса с помощью ESP8266.

На рисунке ниже показан результат для запроса POST. Чтобы избежать необходимости настраивать собственный сервер для тестирования кода ESP8266, вы можете просто отправить запрос в API тестирования.

Тестирование кода POST запроса с помощью ESP8266.

Заключительные и примечания по POST-запросу с помощью ESP8266.

В качестве альтернативы использованный ранее метод begin может быть вызван с другими наборами параметров, что можно увидеть в спецификации класса HTTPClient. Например, мы можем передать IP-адрес хоста, порт и путь как 3 разных.

Класс HTTPClient также имеет метод, упрощающий отладку ответа на запрос. Итак, если хотим вывести полезную нагрузку ответа в последовательный порт, можем просто вызвать метод writeToStream и в качестве аргумента указать на последовательный порт, который мы инициализировали ранее в функции настройки. Итак, приведенный ниже код является альтернативой методу getString:

http.writeToStream(&Serial);

Это всего лишь 2 альтернативных примера реализации. У класса HTTPClient есть много других полезных методов, не используемых в этом уроке. Вы можете посмотреть их здесь.

Понравился ESP826 урок. HTTP-запрос POST? Не забудь поделиться с друзьями в соц. сетях.

А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.

Спасибо за внимание!

Технологии начинаются с простого!

Фотографии к статье

Файлы для скачивания

 кода HTTP-запрос POST кода HTTP-запрос POST.ino2 Kb 16 Скачать

Комментарии

Ваше Имя*

Сава

Гость: Сава (11 августа, 2021 в 20:21)

Спасибо за понятный урок про esp8266. Что мне нравиться в ваших уроках это небольшие краткие и емкие.