Как получить параметры запроса от ESPAsyncWebServer?

Сейчас у меня есть следующий код

server.on("/on", HTTP_POST, [](AsyncWebServerRequest *request) {
    Serial.println("ON hit.");
    String message;
    Serial.println(request->url());
    if (request->hasParam("device"))
    {
        message = request->getParam("device")->value();
    }
    else
    {
        message = " not specified";
    }
    request->send(200, "text/plain", "On, GET: " + message);
    Serial.print("Device ");
    Serial.println(message);
....

При отправке запроса я получаю сообщение «Устройство не указано».

Я смотрю на request-params(), который возвращает мне количество имеющихся там параметров и возвращает 1. Я записываю это:

server.on("/off", HTTP_POST, [](AsyncWebServerRequest *request) {
    Serial.println("OFF hit.");
    String message;
    int params = request->params();
    Serial.printf("%d params sent in\n", params);
    for (int i = 0; i < params; i++)
    {
        AsyncWebParameter *p = request->getParam(i);
        if (p->isFile())
        {
            Serial.printf("_FILE[%s]: %s, size: %u", p->name().c_str(), p->value().c_str(), p->size());
        }
        else if (p->isPost())
        {
            Serial.printf("_POST[%s]: %s", p->name().c_str(), p->value().c_str());
        }
        else
        {
            Serial.printf("_GET[%s]: %s", p->name().c_str(), p->value().c_str());
        }
    }
    if (request->hasParam("device"))
    {
        message = request->getParam("device")->value();
    }
    else
    {
        message = "not specified";
    }
    request->send(200, "text/plain", "Off, GET: " + message);
    Serial.print("Device ");
    Serial.println(message);

и получить результат

1 params sent in
_POST[device]: puddle
Device not specified  

Если я попытаюсь сделать что-то вроде request->getParam(0)->value().c_str() Я получаю дамп стека, содержащий кучу шестнадцатеричных значений, понятия не имею, что они означают: но это похоже на большую грубую ошибку.

, 👍3

Обсуждение

попробуйте hasParam("устройство", true), @Juraj

обычно параметры предназначены для GET, а POST имеет отдельный интерфейс., @dandavis

@Юрай, вот и все. Хотите дать ответ? Лол, чувствую себя довольно глупо., @rball

на всякий случай кто-нибудь найдет этот фрагмент: В дополнение к @Juraj (правильный) ответ: если вы хотите получить доступ к этому параметру, вам также необходимо сообщить функции, что вам нужны параметры URL: message = request->getParam("device", true)->value();, @Dakkar


1 ответ


Лучший ответ:

3

Для запроса POST hasParam необходимо знать, хотите ли вы проверить параметры URL или параметры x-www-form-urlencoded в теле запроса POST. Вторым параметром hasParam является boolean post, и он имеет значение по умолчанию false. Используйте hasParam("device", true).

,