Как получить ответ HTTP_POST?

esp32 web-server networking web web-service

У меня есть функция для ответов HTTP_POST, но она никогда не вызывается, когда я отправляю ей сообщение. Вместо этого я получаю веб-страницу.

Я взываю к нему с

server.on("/",HTTP_POST,response);

Но я получаю только URL-адрес в ответ.

void setup() {
    pinMode(led_pin, OUTPUT);

    Serial.begin(115200);
#if defined(__AVR_ATmega32U4__) || defined(SERIAL_USB) || defined(SERIAL_PORT_USBVIRTUAL)
    delay(2000); // Возможность подключения последовательного монитора после сброса и перед первой распечаткой
#endif
    // Просто чтобы знать, какая программа работает на ардуино
    Serial.println(F("START " __FILE__ " from " __DATE__));
    Serial.print(F("Ready to send IR signals at pin "));
    Serial.println(IR_SEND_PIN);

    pinMode(led_pin, OUTPUT);
    digitalWrite(led_pin, 0);
    Serial.begin(115200);
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    Serial.println("");

    // Ожидание подключения
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }

    Serial.println("");
    Serial.print("Connected to ");
    Serial.println(ssid);
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());

    if (MDNS.begin("esp32")) {
      Serial.println("MDNS responder started");
    }

    server.on("/", handleRoot);
    server.on("/test.svg", drawGraph);
    server.on("/",HTTP_POST,response);
    server.on("/inline", []() {
    server.send(200, "text/plain", "this works as well");
    });
    server.onNotFound(handleNotFound);
    server.begin();
    Serial.println("HTTP server started");

}



void response(){
  //int khz = 38; // Несущая частота 38 кГц для протокола NEC
  
  if(server.hasArg("on") && (server.arg("on").length()>0)){ // TODO убедитесь, что он не длиннее 31 символа
      Serial.print("Server was turned on:\t");
      Serial.println(server.arg("on"));

      ++CYCLE0;
      server.sendHeader("Location", String("/"), true); //как сделать редирект, следующие две строки
      server.send ( 302, "text/plain", "");
  } else if (server.hasArg("off") && (server.arg("off").length()>0)){
      Serial.print("Server was turned off:\t");
      Serial.println(server.arg("off"));

      ++CYCLE1;
      server.sendHeader("Location", String("/"), true);
      server.send ( 302, "text/plain", "");

   } else if (server.hasArg("up") && (server.arg("up").length()>0)){
      Serial.print("Server temp was turned up:\t");
      Serial.println(server.arg("up"));

      ++CYCLE2;
      server.sendHeader("Location", String("/"), true);
      server.send ( 302, "text/plain", "");

  } else if (server.hasArg("down") && (server.arg("down").length()>0)){
      Serial.print("Server temp was turned down:\t");
      Serial.println(server.arg("down"));

      ++CYCLE3;
      server.sendHeader("Location", String("/"), true);
      server.send ( 302, "text/plain", "");
  
  } else {
    server.send(400, "text/html", "<html><body><h1>HTTP Error 400</h1><p>Bad request. Please enter a value.</p></body></html>");
  }
}

Как получить ответ http post вместо веб-страницы?

Ответ ПОСЛЕ публикации:

<html>

<head>
    <meta http-equiv='refresh' content='5' />
    <title>ESP32 Demo</title>
    <style>
        body {
            background-color: #cccccc;
            font-family: Arial, Helvetica, Sans-Serif;
            Color: #000088;
        }
    </style>
</head>

<body>
    <h1>Hello from ESP32!</h1>
    <p>Uptime: 00:05:32</p> <img src="/test.svg" />
    <h2>Turn air condistioner on</h2>
    <p>AC has been cycled 0 times</p>
    <form name='frm0' method='post'> <input type='text' name='on' value=8000>
        <input type='submit' value='Submit'>     </form>
        <p>Turn air conditioner off 0 times</p>
        <form name='frm1' method='post'> <input type='text' name='off' value=8000>
            <input type='submit' value='Submit'>     </form>
            <p>Turn temperature up 0 times</p>
            <form name='frm2' method='post'> <input type='text' name='up' value=8000>
                <input type='submit' value='Submit'>     </form>
                <p>Turn temperature down 0 times</p>
                <form name='frm3' method='post'> <input type='text' name='down' value=8000>
                    <input type='submit' value='Submit'>     </form>
</body>

</html>

Полный код

длинная версия

, 👍2


1 ответ


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

2

У вас есть:

server.on("/", handleRoot);
server.on("/test.svg", drawGraph);
server.on("/",HTTP_POST,response);

Первый вызов с использованием handleRoot не имеет определенного метода, и в этом случае кажется, что любой метод приемлем. Позже вы укажете server.on("/",HTTP_POST,response); специально для запросов POST. Они добавляются в список обработчиков запросов в указанном порядке. И, видимо, советовались в данном порядке.

Короче говоря, вам нужно указать HTTP_GET для handleRoot или просто сначала указать свой HTTP_POST для ответа, а затем позволить handleRoot перехватывать запросы, отличные от HTTP_POST:

server.on("/",HTTP_POST,response);
server.on("/", handleRoot);
server.on("/test.svg", drawGraph);
,

Вот и все. По какой-то причине он все еще возвращает URL-адрес вместо ответа, возвращаемого клиенту, но я определенно вижу попадание запроса post. Я установил оба btw server.on("/",HTTP_POST,response); server.on("/",HTTP_GET, handleRoot);, @brad