Hello.
I encountered this project: https://github.com/DroneBridge/ESP32 and I saw that the web-page works flawlessly and the information on page change without refreshing the page even on submit.
I am using this web-server for my projects and each time I submit data (POST) to the server I redirect to the same page, meaning that I reload the page.
This is a GET handler:
server.on("/home", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send(SPIFFS, "/index.html", "text/html", false, processor); });
This is a POST handler:
server.on("/home", HTTP_POST, [](AsyncWebServerRequest *request)
{
if (request->hasArg("send_data_when_submit_btn_pressed"))
{
int params = request->params();
for (int i = 0; i < params - 1; i++)
{
AsyncWebParameter *p = request->getParam(i);
if (p->isPost() && p->value().length() > 0 && p->value() != "#000000")
{
if (p->name() == "brightness")
Brightness = p->value();
}
}
request->redirect("/home");
}
else if (request->hasArg("toggle_btn"))
{
outputFlag = !outputFlag;
String str = outputFlag ? "On" : "Off";
request->redirect("/home");
}
else
{
request->redirect("/home");
}
}); // server.on("/home", HTTP_POST, [](AsyncWebServerRequest * request)
As you can see, for each action I am required to use request->redirect("/home"); which reloads the page when redirecting.
Also, I am currently using AJAX calls to refresh or change data on the page without reloading the page:
var text_box = document.querySelector('.text_box');
if (text_box != null || rs1 != null || rs2 != null) {
function refresh() {
setTimeout(function () {
if ($('.text_box').length) $('.text_box').load('events_placeholder.html');
refresh();
}, 1000);
}
$(document).ready(function () {
if ($('.text_box').length) $('.text_box').load('events_placeholder.html');
refresh();
});
}
This makes a call to the events_placeholder.html
each second and it seems resource consuming.
Is there a better way of doing this ?
Is it possible to implement a framework like VueJS for example on this web-server ?
Hi everyone,
I have looked at the documentation regarding handling post requests, but I cannot seem to find the answers I am looking for.
I am porting some code which was using the plain WebServer implementation. With that implementation I have multiple post requests being used like this
this->webServer->on("/api/configuration/wifi", HTTP_POST, [this]()
{
String data = this->webServer->arg("plain");
DynamicJsonDocument doc(500);
DeserializationError error = deserializeJson(doc, data);
// rest of code omitted.......
}
this->webServer->on("/api/configuration/timer", HTTP_POST, [this]()
{
String data = this->webServer->arg("plain");
DynamicJsonDocument doc(500);
DeserializationError error = deserializeJson(doc, data);
// rest of code omitted.......
}
I was reading about the onRequestBody method, which I tried using.
this->webServer.onRequestBody([this](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total)
{
if (request->url() == "/api/configuration/wifi")
{
this->HandleWifiConfig(request, data);
}
});
With the above, In the HandleWifiConfig method does indeed get called, it does return a response, using
request->send(200, "application/json", "testing");
However the onNotFound handler still gets called.
Am I still meant to register a handler using "webServer.on(......"?
If so, what would the signature look like?
On the client side, I am doing a normal http post request, with the body being set to json.
I am not too keen on using the Json handler as documented, I would rather stick to my manual parsing for the moment, its been working for a year.
Thanks
I came right following this link
https://github.com/me-no-dev/ESPAsyncWebServer/issues/195#issuecomment-324720231
Good evening,
I ran into an issue, hopefully someone can assist.
I have two endpoints
this->webServer.on("/api/configuration/wifi", HTTP_GET, [this](AsyncWebServerRequest *request)
{
AsyncWebServerResponse *response = request->beginResponse(200, "application/json", wifiManager.GetConfigurationAsString());
response->addHeader("Access-Control-Allow-Origin", "*");
request->send(response);
});
this->webServer.on("/api/configuration/wifi/status", HTTP_GET, [this](AsyncWebServerRequest *request)
{
WiFiStatus wifiStatus = wifiManager.GetStatus();
AsyncWebServerResponse *response = request->beginResponse(200, "application/json", wifiStatus.ToString());
response->addHeader("Access-Control-Allow-Origin", "*");
request->send(response);
});
I am calling this endpoint http://192.168.4.1/api/configuration/wifi/status
Which should map to the second endpoint above, however it is the first one that gets executed.
Am I doing something wrong?
/api/configuration/wifi/status
one first
How can I serve the css
and js
files without an actual path ? Let's say we have the following handler:
server.on("/script.js", HTTP_GET, [](AsyncWebServerRequest *request)
{
AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/script.js.gz", "text/javascript");
response->addHeader("Content-Encoding", "gzip");
request->send(response);
});
If the user goes to /script.js
he will have access to the file and this seems like a security issue.
I am using ESPAsyncWebServer for a server application. Will receive WiFi credentials Through POST request. Now I want to send response to client only after WiFi is connected. if i try to connect to wifi within
server.on(
"/abc",
HTTP_POST,
{},
NULL,
{
ConnectWiFI();
if(wificonnected())
{
request->send(200);
}
else
{
request->send(400);
}
})
Im getting WGT error if credentials are wrong. How can i use request->send out of this block? or any other suggestions?
Thanks in advance.
hi everyone, i have random wdt.
E (285848) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (285848) task_wdt: - IDLE0 (CPU 0)
E (285848) task_wdt: Tasks currently running:
E (285848) task_wdt: CPU 0: Task0
E (285848) task_wdt: CPU 1: IDLE1
E (285848) task_wdt: Aborting.
abort() was called at PC 0x40174258 on core 0
ELF file SHA256: 0000000000000000
Backtrace: 0x400887e8:0x3ffbfa70 0x40088a65:0x3ffbfa90 0x40174258:0x3ffbfab0 0x40086f25:0x3ffbfad0 0x4000bfed:0x3ffdb970 0x4008abe9:0x3ffdb980 0x400894e1:0x3ffdb9a0 0x40166866:0x3ffdb9e0 0x4015633c:0x3ffdba00 0x400d8981:0x3ffdba20 0x400d89e6:0x3ffdba50 0x400d8a55:0x3ffdba70 0x400d8e96:0x3ffdba90 0x4018afb6:0x3ffdbac0 0x400ea915:0x3ffdbaf0 0x400ea9ad:0x3ffdbb10 0x400de266:0x3ffdbb30 0x400dc9e9:0x3ffdbcf0 0x400d82e2:0x3ffdbd40 0x400d3b00:0x3ffdbd60 0x40089a76:0x3ffdbd80
Rebooting...
ets Jun 8 2016 00:22:57
rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,l
2021-10-26 12:15:37.713
en:10124
load:0x40080400,len:5828
entry 0x400806a8
Decoding stack results
0x400887e8: invoke_abort at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/esp32/panic.c line 156
0x40088a65: abort at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/esp32/panic.c line 171
0x40174258: task_wdt_isr at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/esp32/task_wdt.c line 174
0x4008abe9: vTaskExitCritical at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/tasks.c line 4274
0x400894e1: xQueueGenericSend at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/queue.c line 828
0x40166866: sys_mutex_unlock at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/lwip/port/esp32/freertos/sys_arch.c line 93
0x4015633c: lwip_ioctl_r at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/lwip/lwip/src/api/sockets.c line 3489
0x400d8981: WiFiClientRxBuffer::r_available() at C:.platformio\packages\framework-arduinoespressif32\libraries\WiFi\src\WiFiClient.cpp line 49
0x400d89e6: WiFiClientRxBuffer::fillBuffer() at C:.platformio\packages\framework-arduinoespressif32\libraries\WiFi\src\WiFiClient.cpp line 71
0x400d8a55: WiFiClientRxBuffer::read(unsigned char, unsigned int) at C:.platformio\packages\framework-arduinoespressif32\libraries\WiFi\src\WiFiClient.cpp line 107
0x400d8e96: WiFiClient::read(unsigned char, unsigned int) at C:.platformio\packages\framework-arduinoespressif32\libraries\WiFi\src\WiFiClient.cpp line 437
0x4018afb6: WiFiClient::read() at C:.platformio\packages\framework-arduinoespressif32\libraries\WiFi\src\WiFiClient.cpp line 345
0x400ea915: Stream::timedRead() at C:.platformio\packages\framework-arduinoespressif32\cores\esp32\Stream.cpp line 36
0x400ea9ad: Stream::readStringUntil(char) at C:.platformio\packages\framework-arduinoespressif32\cores\esp32\Stream.cpp line 330
0x400de266: WebServer::_parseRequest(WiFiClient&) at C:.platformio\packages\framework-arduinoespressif32\libraries\WebServer\src\Parsing.cpp line 78
0x400dc9e9: WebServer::handleClient() at C:.platformio\packages\framework-arduinoespressif32\libraries\WebServer\src\WebServer.cpp line 310
0x400d82e2: webserver_loop() at src\webserver_pro.cpp line 312
0x400d3b00: Task0code(void*) at src\main.cpp line 41
0x40089a76: vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c line 143
but don't know how to fix.
Can it handle multipart form? I browsed the readme, but the only thing I could find was multipart()
that returns true/false. I want to know whether it can read values from a multipart POST. I confirmed that my POST code works correctly by posting it to https://httpbin.org/post; it returned
{
"args": {},
"data": "",
"files": {},
"form": {
"cat": "\u0001\u0002\u0000\u0003\u0004",
"dog": "hello"
},
"headers": {
"Content-Length": "265",
"Content-Type": "multipart/form-data; boundary=\"8a9f2dc0-11a8-451a-9d5e-376624de7af7\"",
"Host": "httpbin.org", .....
So, I want to get that "dog" and "cat" in my ESP. But when I listed all arguments using the readme code:
//List all parameters (Compatibility)
int args = request->args();
for (int i = 0; i < args; i++)
{
Serial.printf("ARG[%s]: %s\n", request->argName(i).c_str(), request->arg(i).c_str());
}
what I got was:
ARG[o]:
ARG[a]: ␁␂
So, how can I get the string "hello" for the "dog" argument, and { 0x01, 0x02, 0x00, 0x03, 0x04 } for the "cat" argument? Is it supported? Any example?
How can I alter content based on a GET requests accept header?
I have a piece of code that looks like this:
server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(SPIFFS, "/index.html", String(), false);
});
which works as designed. However I need to send back different data, depending on the Accept header. Something like this:
server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
if (request->contentType() == "application/json") {
request->send(200, "text/json", String(publishData));
} else {
request->send(SPIFFS, "/index.html", String(), false);
}});
Doesn't seem to work. What do I miss?
Hi!
I just couldn't find any working examples for TLS so I made an example sketch for TLS WebServer using this library.
Check it out here: https://gitlab.com/artonworkstm/asyncwebservertls
Also want to fasten up a bit the request process by caching sessions so there is no need to redo the whole handshake at every request.
Do you guys know how may I achieve that?
I found it in the ESP8266WiFi library that you can use there (tho I couldn't make it work).
The Session class is here at line 139: https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/src/BearSSLHelpers.h
Content-Type: application/javascript
for jQuery.min
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
{
request->send_P(200, "text/html", HTMLhead);
request->send_P(200, "text/html", HTMLmain);
request->send_P(200, "text/html", HTMLfoot);
});
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
{
AsyncResponseStream *response = request->beginResponseStream("text/html");
response->printf_P(HTMLhead);
response->printf_P(HTMLMain);
response->printf_P(HTMLfoot);
request->send(response);
});
Hi all. Fairly new and very sorry if answered as I've looked but I'm trying to use AsyncWebServer with SdFat and 128 GB exFAT SDHC. I'm having issues with the following lines in my code since I'm not using SD.h
request->send(SD, "/index.html", "text/html");
});
server.serveStatic("/", SD, "/");
I've tried changing SD
to sd
, and file
objects without success. Also tried FS
and fs
with no luck. I'm fairly new and jsut not sure what filesystem to send from SdFat for request->send