介绍
代码 由于我们希望开发一个可重复使用的通用解决方案,因此我们将把代码封装在一个函数中。当然,这个函数会有一个输入变量,所以我们可以向其传递要处理的URL查询字符串。我们将这个函数命名为qs_parse。
[mw_shl_code=applescript,true]
def qs_parse(qs):
## Function code
[/mw_shl_code]
[mw_shl_code=applescript,true]parameters = {}[/mw_shl_code]
如前所述,我们知道“参数-值”对之间可以用“&”分隔。因此,如果我们使用“&”字符作为分隔符,我们就可以隔离每个参数值对。 请注意,由于split函数是一个字符串方法,所以我们在调用它时需要使用包含查询参数的字符串变量。在这个示例中,该字符串是qs_parse函数的输入参数,我们称之为qs。
[mw_shl_code=applescript,true]ampersandSplit = qs.split("&")[/mw_shl_code]
由于我们要开发一个通用的解析函数,所以假设我们不知道查询中存在多少个参数。因此,我们将使用for …in循环对前面获取的列表元素进行逐个迭代处理。
[mw_shl_code=applescript,true]for element in ampersandSplit:
#iteration code
[/mw_shl_code]
在每次循环迭代中,元素变量将由每个“参数-值”对构成的字符串赋值,字符串格式为“参数=值”。我们已经知道,参数和值由“=”字符分隔,所以我们可以再次使用split函数,使用“=”字符作为分隔符进一步分割字符串。
[mw_shl_code=applescript,true]equalSplit = element.split("=")
[/mw_shl_code]
由于我们采用的是逐对重复处理的方式,所以我们知道此操作的输出结果将始终是一个具有两个位置的列表。第一个位置是参数的名称(它是分隔符字符左侧的子字符串),第二个位置是其值(它是分隔符字符右侧的子字符串)。 考虑到这一点,我们只需将结果列表的第一个元素映射到字典的键(key),将第二个元素映射到字典的值(value)。请记住,MicroPython索引号是从零开始的,因此列表第一个和第二个元素的索引号分别为0和1。
[mw_shl_code=applescript,true]parameters[equalSplit[0]] = equalSplit[1]
[/mw_shl_code]
在代码的最后,我们将返回字典,它存储在parameters变量中。
[mw_shl_code=applescript,true]
def qs_parse(qs):
parameters = {}
ampersandSplit = qs.split("&")
for element in ampersandSplit:
equalSplit = element.split("=")
parameters[equalSplit[0]] = equalSplit[1]
return parameters[/mw_shl_code]
测试代码 若要测试代码,只需将其上传到ESP32上即可。在这个示例中,我使用了uPyCraft,它将创建一个后缀名为.py文件。 我将调用文件qs_parse(我对函数使用了相同的名称,但它可能有所不同),因此稍后我需要将其作为模块导入,以便能够使用已开发的函数。在上传之后,为了测试一切,我们可以使用以下代码。
[mw_shl_code=applescript,true]import qs_parse
stringToParse = "param1=val1¶m2=val2¶m3=val3"
parameters = qs_parse.qs_parse(stringToParse)
print(parameters)
[/mw_shl_code]
就像快速分析一样,我们首先导入我们封装函数的模块。然后我们将声明一个匹配示例中URL查询字符串的字符串。最后,我们将调用模块的qs_parse函数(请记住,模块和函数具有相同的名称)并把结果打印出来。图1显示了输出结果。
图1 - 应用查询字符串解析器的输出结果
可以看出,输出的字典由与URL参数匹配的Key(键)和Value(值)组成。我们可以在随后使用字典函数来检查可用的Key(键)和Value(值)。
注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。 他写了很多有关ESP32、ESP8266的有用的教程和项目。
查看更多ESP32/ESP8266教程和项目,请点击 : ESP32教程汇总贴
|