我想使用ESP8266WebServer.h将所有以“/robot”开头的路径发送到特定的处理程序。我尝试了几种变化:
server.on ( "/robot", handleDirection );
server.on ( "/robot/", handleDirection );
server.on ( "/robot/*", handleDirection );
但在每种情况下,它只监听精确的路径(包括那个星号*)。
这个库不支持通配符路径吗?还是我不知道如何做?
面向对象的方式非常容易实现。
class MyHandler : public RequestHandler {
bool canHandle(HTTPMethod method, String uri) {
return uri.startsWith( "/robot" );
}
bool handle(ESP8266WebServer& server, HTTPMethod requestMethod, String requestUri) {
doRobot( requestUri );
server.send(200, "text/plain", "Yes!!");
return true;
}
} myHandler;
...
server.addHandler( &myHandler );
...
我在一个例子中找到了解决方法。我可以让我的未找到处理程序直接检查URI并处理这种情况。例如:
void handleDirection(String path) {
int index = path.lastIndexOf('/');
String direction = path.substring(index, path.length());
Serial.println(direction);
}
void handleNotFound() {
String path = server.uri();
int index = path.indexOf("/robot");
if (index >= 0) {
handleDirection(path);
}
returnNotFound();
}
void setup() {
[...]
server.onNotFound ( handleNotFound );
[...]
}
目前它可以工作。我将保留这个问题未回答,以便其他人找到正确的解决方法。
您可以通过使用正则表达式来完成以下操作:
#include <uri/UriRegex.h>
web_server.on(UriRegex("/home/([0-9]+)/first"), HTTP_GET, [&]() {
web_server.send(200, "text/plain", "Hello from first! URL arg: " + web_server.pathArg(0));
});
web_server.on(UriRegex("/home/([0-9]+)/second"), HTTP_GET, [&]() {
web_server.send(200, "text/plain", "Hello from second! URL arg: " + web_server.pathArg(0));
});
然后尝试像这样调用URL:
http://<IP ADDRESS>/home/123/first
接下来,您应该在浏览器中看到以下内容!
来自first的问候! URL参数: 123
请注意,每个正则表达式组都将对应于一个pathArg
。
在检查ESP的Arduino框架的源代码后,并根据GitHub上的以下文件,拉取请求和问题,根据这个评论指出您有三个选项:
选项1:由@Bmooij提出的使用自定义“{}”作为通配符和#5214中的pathArgs
选项2:glob样式模式匹配,在#5467中广泛使用,是大多数shell中使用的
选项3:正则表达式模式匹配,也是超级标准,尽管有点复杂。