在ESP8266WebServer中设置通配符

10

我想使用ESP8266WebServer.h将所有以“/robot”开头的路径发送到特定的处理程序。我尝试了几种变化:

server.on ( "/robot", handleDirection );
server.on ( "/robot/", handleDirection );
server.on ( "/robot/*", handleDirection );

但在每种情况下,它只监听精确的路径(包括那个星号*)。

这个库不支持通配符路径吗?还是我不知道如何做?

3个回答

5

面向对象的方式非常容易实现。

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 );
...

3

我在一个例子中找到了解决方法。我可以让我的未找到处理程序直接检查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 );
    [...]
}

目前它可以工作。我将保留这个问题未回答,以便其他人找到正确的解决方法。


3

简述

您可以通过使用正则表达式来完成以下操作:

#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:正则表达式模式匹配,也是超级标准,尽管有点复杂。


1
这绝对是最好的方法!谢谢。 - Bram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接