我试图根据服务器收到的请求将服务器初始化为特定的输入。有很多,所以我想用如下循环来初始化它:
void serverInit() {
for (int i = 1; i <= qty; i++) {
String s = "/readBatt" + i;
server.on(s, runTest(i));
}
server.begin();
Serial.println("Server started.");
}
它告诉我server.on(s, runTest(i));
是对void表达式的无效使用。我知道它希望将其格式设置为server.on(s, runTest)
,但是函数runTest(int n)
需要一个参数。如何将该参数传递给函数?
答案 0 :(得分:2)
似乎您正在使用ESP32 Arduino库中的WebServer类。正如您已经搜集到的那样,在on()
方法中指定的回调不接受任何参数。
但是,您还有其他选择。您可以在URL路径中使用大括号-{}
指定一个“占位符”。然后,在回调中,可以使用pathArg()
方法检索相应的参数-该方法接受参数索引作为参数。
示例...
您可以将API端点定义为/readBatt/<battery number>
。要配置服务器以处理对此端点的请求,则可以使用
server.on("/readBatt/{}", runTest);
在回调中,您将按以下方式检索第一个参数...
static void runTest() {
String batteryNumber = server.pathArg(0);
Serial.println("Request to read battery");
String response = "You attempted to read battery " + batteryNumber;
response += ".\nThis endpoint is a placeholder. Check again soon!";
server.send(200, "text/plain", response);
}
最后...假设您的ESP8266在本地IP地址192.168.1.9上运行。您可以通过打开
来访问新的API端点在您的浏览器中。 (用相关的电池号替换1
。)
不幸的是,我不认为有pathArg()
版本会返回整数,因此您可能必须在某个时候执行转换。
答案 1 :(得分:1)
您可以使用所谓的“关闭”。闭包使您可以编写一个函数,该函数保留对超出其范围的变量的访问。
闭包是使用"lambda expression"(基本上是一个匿名函数)编写的。 C ++用于lambda表达式的语法如下:
[capture variable list](argument list) { body}
捕获变量列表是要在体内使用的变量列表。参数列表是调用者将传入的普通函数参数列表。您将像这样编写所需的lambda表达式:
[i]() { runTest(i); }
并像这样使用它:
server.on(s, [i]() { runTest(i); });
需要明确的是,@ David Collins的答案是编写Web服务器的更好方法。在URL中使用参数比创建几个嵌入参数的URL更好。我只是在回答如何将参数传递给不带参数调用的函数的问题。如果您以更好的方式编写Web服务器代码,则无需这样做(尽管我将对URL中传递的值进行边界检查,以确保获得有效的电池编号)。