WebServer一般是用来被动处理客户端的请求的,所以使用时首先需要注册相应的事件和绑定处理该事件的回调函数。这篇文章将对ESPAsyncWebServer中涉及的一些内容进行简单说明。
本文中各例程演示均在ESP32中进行。
想要正确接收处理客户端发出的HTTP请求首先需要对各个请求绑定其触发时处理的回调函数,最常用的就是 AsyncWebServer 对象的 on() 方法了:
AsyncWebServer server(80);
void callback(AsyncWebServerRequest *request){
request->send(200);} // 回调函数
void setup()
{
// 下面的on()方法最常用的方式,参数分别填入url、http_method、onRequest_callback
// 其中http_method可选HTTP_GET、HTTP_POST、HTTP_DELETE、HTTP_PUT HTTP_PATCH、HTTP_HEAD、HTTP_OPTIONS、HTTP_ANY
server.on("/url", HTTP_ANY, callback);
}
上面方法中填入的回调函数使用时通常只涉及到HTTP请求请求行和请求头的内容,如果HTTP请求中带有其它附加数据的话需要单独绑定回调函数处理。比如带有HTTP请求带有文件上传:
AsyncWebServer server(80);
void upload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final){
if(!index){
Serial.printf("UploadStart: %s\n", filename.c_str());
}
for(size_t i=0; i<len; i++){
Serial.write(data[i]);
}
if(final){
Serial.printf("UploadEnd: %s, %u B\n", filename.c_str(), index+len);
}
}
void callback(AsyncWebServerRequest *request){
request->send(200);}
void setup()
{
server.on("/", HTTP_POST, callback, upload); // 增加onUpload时回调函数
}
再或者请求中有其它形式数据在主体中:
AsyncWebServer server(80);
void upload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final){
}
void body(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){
if(!index){
Serial.printf("BodyStart: %u B\n", total);
}
for(size_t i=0; i<len; i++){
Serial.write(data[i]);
}
if(index + len == total){
Serial.printf("BodyEnd: %u B\n", total);
}
}
void callback(AsyncWebServerRequest *request){
request->send(200);}
void setup()
{
server.on("/", HTTP_POST, callback, upload, body); // 增加onUpload时和onBody时回调函数
}
上面演示了onUpload和onBody的情况,更进一步的现在很多时候body中收到的数据都是 json 形式的,面对这种形式的数据,除了直接在onBody中读取解析外还有别的方式可以处理:
#include
#include
syncWebServer server(80);
AsyncCallbackJsonWebHandler* handler = new AsyncCallbackJsonWebHandler("/url", [](AsyncWebServerRequest *request, JsonVariant &json) {
JsonObject& jsonObj = json.as<JsonObject>();
// ...
});
void setup()
{
server.addHandler(handler);
}
ESPAsyncWebServer中对于json的处理用到了ArduinoJson,需要另外安装,其安装使用说明可以参考下面文章:
《C++ Json库ArduinoJson介绍及使用说明》
上面所有情况都是已经确定了URL的情况,如果URL不确定,想要提供一种通用的方案的话可以使用下面的几个方法:
// 下面几个方法需要填入各自对应形式的回调函数
server.onNotFound(onRequestCallBack);
server.onFileUpload(onUploadCallBack);
server.onRequestBody(onBodyCallBack);
AsyncWebServer对象提供了rewrite()方法用来重写URL,实现服务器内部的跳转:
server.rewrite("/", "/lalala"); // 用户访问"/"时,服务器内部会执行"/lalala"的回调函数
server.on("/lalala", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", "lalala~~~");});
除了上面给出的方式对url的重写以外还可以自定义重写规则,相关的说明可以参考项目官方文档中 Param Rewrite With Matching
章节。
ESPAsyncWebServer有过滤器(filters)功能,可以对客户端发起的HTTP请求进行选择性执行:
server.on("/", HTTP_GET, callback1).setFilter(ON_AP_FILTER); // ESP32工作在AP模式时起效
server.on("/", HTTP_GET, callback2).setFilter(ON_STA_FILTER); // ESP32工作在STA模式时起效
server.rewrite("/", "/ap").setFilter(ON_AP_FILTER); // ESP32工作在AP模式时起效
server.rewrite("/", "/sta").setFilter(ON_STA_FILTER); // ESP32工作在STA模式时起效
bool userFilter(AsyncWebServerRequest *request){
return true;} // 自定义规则
server.on("/", HTTP_GET, callback).setFilter(userFilter); // 当userFilter返回true时起效
如果想要移除已绑定过的事件处理和重写可以使用以下方式:
// save callback for particular URL path
auto handler = server.on("/some/path", [](AsyncWebServerRequest *request){
//do something useful
});
// when you don't need handler anymore remove it
server.removeHandler(&handler);
// same with rewrites
server.removeRewrite(&someRewrite);
server.onNotFound([](AsyncWebServerRequest *request){
request->send(404);
});
// remove server.onNotFound handler
server.onNotFound(NULL);
// remove all rewrites, handlers and onNotFound/onFileUpload/onRequestBody callbacks
server.reset();
需要特别注意一点的是某个链接如果已经绑定过回调函数,想要更换回调函数的话必须按照上面方式先删除先前的绑定,然后再绑定新的回调函数。
ESPAsyncWebServer事件处理绑定基础的就是上面这些内容,更多内容可以查看项目官方的文档和例程,或者我的其他ESPAsyncWebServer的文章:
ESPAsyncWebServer项目地址:https://github.com/me-no-dev/ESPAsyncWebServer
《Arduino for ESP8266&ESP32适用库ESPAsyncWebServer:快速入门》
《Arduino for ESP8266&ESP32适用库ESPAsyncWebServer:事件处理绑定》
《Arduino for ESP8266&ESP32适用库ESPAsyncWebServer:请求与响应》
《Arduino for ESP8266&ESP32适用库ESPAsyncWebServer:静态文件和模板引擎》
《Arduino for ESP8266&ESP32适用库ESPAsyncWebServer:WebSocket和EventSource》