Сервер ESP32 HTTPS - как получить строку запроса POST
Я пытаюсь настроить ESP32 (DOIT ESP32 DEVKIT V1 в Arduino IDE, с библиотеками Wi-Fi Espressif) со следующими включениями на данный момент:
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiAP.h>
#include <HTTPSServer.hpp>
#include <SSLCert.hpp>
#include <HTTPRequest.hpp>
#include <HTTPResponse.hpp>
Теперь, если у меня есть процедура обратного вызова, настроенная с
ResourceNode * nodeEchoPost = new ResourceNode("/cmd", "POST", &handleEcho);
как я могу разобрать строку запроса POST? На последовательной консоли я получаю
[HTTPS:I] Request: POST /cmd
который является отладочным выводом из самой библиотеки HTTPSRequest. Но я понятия не имею, как получить эту строку '/ cmd' для собственного использования! Я попробовал пример кода
byte buffer[256];
size_t s = req->readBytes(buffer, 256);
получение буфера, который возвращает только мусор, вероятно, потому, что весь запрос находится в операторе POST, а тело пустое.
Поскольку все, что мне нужно, это запрос-информация
'/cmd?command1=foo&command2=bar&etc'
хорошо измельчить и использовать.. как мне получить это из библиотеки? Я погуглил и поискал в заголовочных файлах библиотеки, но безуспешно.
Кроме того, есть ли какое-либо преимущество в использовании библиотеки WiFiClientSecure вместо этого, поскольку все уже передается по протоколу HTTPS? Это скорее побочный вопрос, хотя, если таким образом будет проще получить строку запроса, я полностью согласен с этим.
@Snout, 👍-2
2 ответа
Я думаю, что нашел ответ, просмотрев примеры в репозитории github HTTPS-библиотеки Hessel.
Короче говоря, похоже, это оно и есть:
void handleEcho(HTTPRequest * req, HTTPResponse * res) {
Serial.print("in handleEcho. request is:");
Serial.println(req->getRequestString().c_str());
Вывод с последовательной консоли:
"in handleEcho. request is:/cmd?command1=foo&cmd2=bar"
Теперь у меня есть текстовая строка, для которой я могу использовать простые строковые команды, чтобы разрезать ее на части с помощью strtok или чего-то подобного. Я не возражаю против дополнительных хлопот по поиску ключевых слов в строке, я счастлив, что просто получил эту чертову штуку.
Поскольку у меня есть все данные, которые я хочу в этом запросе, я просто использую req-> readBytes, как указано в примерах, чтобы очистить буфер и удалить все "основные" данные.
И кто-то должен согласиться со мной, что добавление .c_str() к уже существующей функции просто кажется слишком сложным. :/
Это GET, а не POST, поэтому переменные доступны с помощью
auto params = req->getParams();
std::string command1;
std::string cmd2;
bool hascommand1 = params->getQueryParameter("command1", command1);
bool hascmd2 = params->getQueryParameter("cmd2", cmd2);
Смотрите пример по адресу https://github.com/fhessel/esp32_https_server/blob/master/examples/Parameters/Parameters.ino
.c_str()
требуется для перехода от std::string к тому, что нужно println, а не проблема, связанная с самой функцией getRequestString()
Я наткнулся на этот вопрос, когда искал способы чтения фактических переменных POST, которые не задокументированы (и в исходном коде нет никаких признаков этого).
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- Как выбрать альтернативные контакты I2C на ESP32?
- Драйверы для чипа последовательного порта CH9102X
- Как преобразовать форматированный оператор print в строковую переменную?
- ESP32 - "Детектор Браунаута был активирован" при запуске Wi-Fi
- Питание esp32cam от аккумулятора
- Контакты RX и TX на esp32
- ESP32: отключить детектор отключения питания