Сервер 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? Это скорее побочный вопрос, хотя, если таким образом будет проще получить строку запроса, я полностью согласен с этим.

, 👍-2


2 ответа


0

Я думаю, что нашел ответ, просмотрев примеры в репозитории 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() к уже существующей функции просто кажется слишком сложным. :/

,

1

Это 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, которые не задокументированы (и в исходном коде нет никаких признаков этого).

,