本文的目的是解释如何使用 micropython 开发一个非常简单的 url 查询字符串解析器。解释查询字符串是什么超出了本文的范围, 但您可以在这里阅读有关它的更多信息:https://en.wikipedia.org/wiki/Query_string。
我们的查询字符串解析器将非常简单, 因此我们将假定查询字符串具有良好的行为格式, 因此所有参数值对都由 “&” 字符分隔, 每个参数与其值之间用 “=” 分隔字符。我们还将假定每个参数始终具有相应的值。
通过本 esp32教程所显示的测试是使用DFRobot 的esp-wroom-32设备集成在fireebettle esp32 主板中进行的。使用的 IDE 是"upycaft",使用教程:ESP32 MicroPython教程:uPyCraft IDE入门。
由于我们希望开发一个可重复使用的通用解决方案,因此我们将把代码封装在一个函数中。当然,这个函数会有一个输入变量,所以我们可以向其传递要处理的URL查询字符串。我们将这个函数命名为qs_parse。
def qs_parse(qs):
## Function code
在函数内部,我们将首先声明一个空字典,它可以很好地映射查询字符串的“参数 = 值”结构。参数名称将用作字典的key(键),因此,我们将能够通过其名称访问每个参数。您可以查看前面的教程了解有关字典的更多信息:ESP32 / ESP8266 MicroPython教程:如何使用字典。
parameters = {}
如前所述,我们知道“参数-值”对之间可以用“&”分隔。因此,如果我们使用“&”字符作为分隔符,我们就可以隔离每个参数值对。
为此,我们可以使用字符串split方法(https://techtutorialsx.com/2017/09/29/esp32-esp8266-micropython-string-split-method/ ),将用作分隔符的字符串作为输入参数,并返回由分隔符分割的子字符串列表。分隔符不包含在结果中,因此,我们将得到一个干净的列表,在这个列表中,每个子字符串都对应着一个“参数-值”对。
请注意,由于split函数是一个字符串方法,所以我们在调用它时需要使用包含查询参数的字符串变量。在这个示例中,该字符串是qs_parse函数的输入参数,我们称之为qs。
ampersandSplit = qs.split("&")
由于我们要开发一个通用的解析函数,所以假设我们不知道查询中存在多少个参数。因此,我们将使用for …in循环对前面获取的列表元素进行逐个迭代处理。
for element in ampersandSplit:
#iteration code
在每次循环迭代中,元素变量将由每个“参数-值”对构成的字符串赋值,字符串格式为“参数=值”。我们已经知道,参数和值由“=”字符分隔,所以我们可以再次使用split函数,使用“=”字符作为分隔符进一步分割字符串。
equalSplit = element.split("=")
由于我们采用的是逐对重复处理的方式,所以我们知道此操作的输出结果将始终是一个具有两个位置的列表。第一个位置是参数的名称(它是分隔符字符左侧的子字符串),第二个位置是其值(它是分隔符字符右侧的子字符串)。
考虑到这一点,我们只需将结果列表的第一个元素映射到字典的键(key),将第二个元素映射到字典的值(value)。请记住,MicroPython索引号是从零开始的,因此列表第一个和第二个元素的索引号分别为0和1。
parameters[equalSplit[0]] = equalSplit[1]
在代码的最后,我们将返回字典,它存储在parameters变量中。
def qs_parse(qs):
parameters = {}
ampersandSplit = qs.split("&")
for element in ampersandSplit:
equalSplit = element.split("=")
parameters[equalSplit[0]] = equalSplit[1]
return parameters
若要测试代码,只需将其上传到ESP32上即可。在这个示例中,我使用了uPyCraft,它将创建一个后缀名为.py文件。
我将调用文件qs_parse(我对函数使用了相同的名称,但它可能有所不同),因此稍后我需要将其作为模块导入,以便能够使用已开发的函数。在上传之后,为了测试一切,我们可以使用以下代码。
import qs_parse
stringToParse = "param1=val1¶m2=val2¶m3=val3"
parameters = qs_parse.qs_parse(stringToParse)
print(parameters)
就像快速分析一样,我们首先导入我们封装函数的模块。然后我们将声明一个匹配示例中URL查询字符串的字符串。最后,我们将调用模块的qs_parse函数(请记住,模块和函数具有相同的名称)并把结果打印出来。图1显示了输出结果。
图1 - 应用查询字符串解析器的输出结果
可以看出,输出的字典由与URL参数匹配的Key(键)和Value(值)组成。我们可以在随后使用字典函数来检查可用的Key(键)和Value(值)。
注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。
他写了200多篇有关ESP32、ESP8266的有用的教程和项目。涉及arduino、micropython、 Picoweb、Espruino、Bluetooth、RFID、IDF……等等非常广泛,说是最全的完全不为过。
精华教程:
ESP32 MicroPython教程:uPyCraft IDE入门
ESP32 MicroPython教程:解析JSON
ESP32 MicroPython教程:MicroPython支持
ESP32 MicroPython教程:连接Wi-Fi网络
ESP32 / ESP8266 MicroPython教程:自动连接WiFi
ESP32 / ESP8266 MicroPython教程:从文件系统运行脚本
ESP32 / ESP8266 MicroPython教程:HTTP GET请求
ESP32 Arduino教程:用于构建ESP32编译环境的Arduino IDE软件
ESP32 Arduino教程:FreeRTOS队列性能测试
ESP32 RFID教程:打印MFRC522固件版本
ESP32 Picoweb教程:获取请求的HTTP方法
……
还有更多教程: ESP32教程 合集
英文版 :ESP32 tutorial合集