ESP32 MicroPython教程:开发一个简单的URL查询字符串解析器-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2403|回复: 0

ESP32 MicroPython教程:开发一个简单的URL查询字符串解析器

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


介绍
本文的目的是解释如何使用 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。

[mw_shl_code=applescript,true]
def qs_parse(qs):
## Function code
[/mw_shl_code]

在函数内部,我们将首先声明一个空字典,它可以很好地映射查询字符串的“参数 = 值”结构。参数名称将用作字典的key(键),因此,我们将能够通过其名称访问每个参数。您可以查看前面的教程了解有关字典的更多信息:ESP32 / ESP8266 MicroPython教程:如何使用字典

[mw_shl_code=applescript,true]parameters = {}[/mw_shl_code]


如前所述,我们知道“参数-值”对之间可以用“&”分隔。因此,如果我们使用“&”字符作为分隔符,我们就可以隔离每个参数值对。
为此,我们可以使用字符串split方法(https://techtutorialsx.com/2017/09/29/esp32-esp8266-micropython-string-split-method/),将用作分隔符的字符串作为输入参数,并返回由分隔符分割的子字符串列表。分隔符不包含在结果中,因此,我们将得到一个干净的列表,在这个列表中,每个子字符串都对应着一个“参数-值”对。
请注意,由于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)
他写了很多有关ESP32ESP8266的有用的教程和项目。


查看更多ESP32/ESP8266教程和项目,请点击 : ESP32教程汇总贴
英文版教程 ESP32 tutorial



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

本版积分规则

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

GMT+8, 2024-11-28 02:42 , Processed in 0.071921 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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