Как получить ответ HTTP_POST?
У меня есть функция для ответов 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>
Полный код
длинная версия
@brad, 👍2
1 ответ
Лучший ответ:
У вас есть:
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);
- Создание веб-интерфейса для ESP32
- ESP32 в Arduino-IDE с FS.h и SPIFFS
- Почему функция server.on() из "ESPAsyncWebServer.h" выполняется на стороне setup(), а не на стороне loop()?
- Использование AysncUDPMessage для ESP32 для отправки строковых данных
- Интернет-сервер Arduino IDE + ESP32 — как перенаправить на root после нажатия кнопки
- Автоматическая веб-страница ESP32 AP
- Arduino Ethernet shield server и клиент одновременно
- TCP-клиент readStringUntil только при наличии данных
Вот и все. По какой-то причине он все еще возвращает URL-адрес вместо ответа, возвращаемого клиенту, но я определенно вижу попадание запроса post. Я установил оба btw server.on("/",HTTP_POST,response); server.on("/",HTTP_GET, handleRoot);, @brad