ESP Web 服务器处理路径参数

问题描述 投票:0回答:1

我在处理充当 Web 服务器的 ESP 上的请求时遇到问题。 基本上这段代码:

#include <WebServer.h> //using this library
...   
        webServer.on("/api/:userId/lights", HTTP_GET, [this]() { handle_GetState(); });
        webServer.on("/api/:userId/lights/:num", HTTP_GET, [this]() { handle_GetState(); });
        webServer.on("/api/:userId/lights/:num/state", HTTP_PUT, [this]() { handle_PutState(); });
        webServer.on("/", HTTP_GET, [this]() { handle_root(); });
        webServer.on("/debug/clip.html", HTTP_GET, [this]() { handle_clip(); });
        webServer.onNotFound( [this]() { handle_CORSPreflight(); });

应该处理动态路径参数,但在发出请求时(例如:/api/USERXXX/lights),它始终由 onNotFound 函数处理。

我尝试将 ':userId' 替换为 '{}'、'{userId}'、'',但似乎没有任何效果。 显然,当调用 http://192.168.XXX.XXX/api/:userId/lights 时,网络服务器会检索正确的响应,因此无法识别路径参数符号。

有人知道哪种方法是正确的吗?

webserver esp32 esp8266 url-parameters path-parameter
1个回答
0
投票

看起来你的端点需要是这样的:

webServer.on(UriRegex("^\\/api\\/(.*)\\/lights$"), HTTP_GET, [this]() { handle_GetState(); });
    webServer.on(UriRegex("^\\/api\\/(.*)\\/lights\\/([0-9]+)$"), HTTP_GET, [this]() { handle_GetState(); });
    webServer.on(UriRegex("^\\/api\\/(.*)\\/lights\\/[0-9]+\\/state$"), HTTP_PUT, [this]() { handle_PutState(); });
    webServer.on("/", HTTP_GET, [this]() { handle_root(); });
    webServer.on("/debug/clip.html", HTTP_GET, [this]() { handle_clip(); });
    webServer.onNotFound( [this]() { handle_CORSPreflight(); });

使用 URI 正则表达式,您可以在端点处理函数中利用对 webServer 的引用来执行以下操作:

String userId = webServer.pathArg(0);
String lightNum = webServer.pathArg(1);

这应该允许您获取正则表达式 URI 的捕获部分。如果您是正则表达式的新手,则捕获的部分是正则表达式语句中位于括号“()”中的部分,第一个捕获是索引 0,然后从那里开始依此类推。

© www.soinside.com 2019 - 2024. All rights reserved.