ESP32 Arduino HTTP服务器教程:获取查询参数-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4868|回复: 0

ESP32 Arduino HTTP服务器教程:获取查询参数

[复制链接]
发表于 2019-6-26 16:08 | 显示全部楼层 |阅读模式

简介
本文旨在解释如何从发送到ESP32上Arduino核心运行的Web服务器的HTTP请求中获取查询参数
ESP32教程的测试是使用集成在 FireBeetle ESP32开发板中的DFRobot的ESP-WROOM-32设备进行的。
关于ESP32上HTTP异步Web服务器的介绍,请参阅上一篇文章ESP32 Arduino教程:异步HTTP网络服务器

如果你喜欢视频教程,请查看视频:

Arduino代码
我们将通过所需的库加入启动Arduino代码,这将能够设置HTTP服务器,并将ESP32连接到Wi-Fi网络。我们还将声明两个全局变量来保存我们要连接ESP32的无线网络的凭据。
如需声明全局变量,我们需要一个AsyncWebServer类的实例,它接收构造函数的输入,即服务器将侦听传入请求的端口。

[mw_shl_code=applescript,true]
#include <WiFi.h>
#include <FS.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
const char* ssid = "yourNetworkName";
const char* password =  "yourNetworkPass";
AsyncWebServer server(80);[/mw_shl_code]


转到功能设置,我们将首先打开一个串行接口,以便稍后输出程序结果,更确切地说,我们将在请求中接收的查询参数。
之后,我们将使用先前声明的凭据将ESP32连接到Wi-Fi网络。请注意,最后建立连接后,我们在网络上打印ESP32的IP,稍后需要连接到它。

[mw_shl_code=applescript,true]Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
}
Serial.println(WiFi.localIP());[/mw_shl_code]

现在我们将通过将其绑定到处理函数来在我们的服务器上设置路由。在该处理函数内部,我们将访问客户端发送的查询参数。
我们将使用索引路由(“/”)并指定我们只在路由上接收HTTP GET请求。请注意,我们将处理函数声明为lambda函数

[mw_shl_code=applescript,true]
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
// Handling function
});[/mw_shl_code]


在处理函数中,我们将首先检查接收的参数数量。我们可以通过在请求对象上调用params方法来获取此值,我们将接收指针作为处理函数的输入。
此方法不接收任何参数,并且如上所述,将返回请求中接收的参数数量。

[mw_shl_code=applescript,true]int paramsNr = request->params();
Serial.println(paramsNr);[/mw_shl_code]

如需获取实际参数,我们可以使用同一请求对象的getParam方法。此方法接收我们想要获取的参数的索引(从0到参数数减1)并返回指向AsyncWebParameter类对象的指针,该对象包含有关参数信息。
由于我们已经知道前一次调用的参数数量,因此我们可以执行for循环来获取所有参数。
我们可以通过分别调用AsyncWebParameter对象上的name和value方法来获取每个参数的名称和值。
请记住,我们有一个指向对象而不是实际对象的指针,因此我们需要使用- >运算符来访问这些方法。


[mw_shl_code=applescript,true]
for(int i=0;i<paramsNr;i++){
     AsyncWebParameter* p = request->getParam(i);
     Serial.print("Param name: ");
     Serial.println(p->name());
     Serial.print("Param value: ");
     Serial.println(p->value());
     Serial.println("------");
}[/mw_shl_code]


仍在处理函数内部,我们将通过调用请求对象上的send方法将响应返回给客户端。我们将返回一个简单的“Message received”字符串和HTTP OK状态。


[mw_shl_code=applescript,true]request->send(200, "text/plain", "message received");[/mw_shl_code]


如需完成Arduino功能设置,我们在全局服务器对象上调用begin方法,以启动服务器。最终的完整源代码如下所示。


[mw_shl_code=applescript,true]#include <WiFi.h>
#include <FS.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
  
const char* ssid = "yourNetworkName";
const char* password =  "yourNetworkPass";
  
AsyncWebServer server(80);
  
void setup(){
  Serial.begin(115200);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }
  
  Serial.println(WiFi.localIP());
  
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    int paramsNr = request->params();
    Serial.println(paramsNr);
    for(int i=0;i<paramsNr;i++){
         
        AsyncWebParameter* p = request->getParam(i);
        Serial.print("Param name: ");
        Serial.println(p->name());
        Serial.print("Param value: ");
        Serial.println(p->value());
        Serial.println("------");
    }
     
    request->send(200, "text/plain", "message received");
  });
  
  server.begin();
}
  
void loop(){}[/mw_shl_code]


测试代码
如需测试代码,请编译它并使用Arduino IDE将其上传到ESP32。然后打开串行监视器,在连接到Wi-Fi网络完成后,使用打印的IP从您选择的Web浏览器向服务器发送GET请求。

由于我们希望测试查询参数,我们将在我们的请求中添加一些内容。为此,只需在浏览器的地址栏中键入以下内容,通过打印到串行监视器的IP更改{yourEspIp}。
发送请求后,您应该获得类似于图1的输出,该输出显示我们定义的字符串被返回。查询参数在图像中突出显示。

图1  - 使用查询参数向包含查询参数的ESP32 Web服务器发送HTTP GET请求。

如果您回到Arduino串口监视器,您应该有一个如图2所示的输出,它显示了参数的数量,它们的名称和它们的值被打印到控制台。请注意,它们与从Web浏览器发送的内容相匹配。


图2  - 获取HTTP请求的查询参数。




注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。


查看更多ESP32/ESP8266教程和项目:
中文版教程 :ESP32教程 合集
英文版教程 :ESP32 tutorial 合集


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 14:39 , Processed in 0.093984 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表