查看: 69|回复: 0

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

[复制链接]
  • TA的每日心情

    2018-1-11 13:58
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 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。


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



    如前所述,我们知道“参数-值”对之间可以用“&”分隔。因此,如果我们使用“&”字符作为分隔符,我们就可以隔离每个参数值对。
    为此,我们可以使用字符串split方法(https://techtutorialsx.com/2017/09/29/esp32-esp8266-micropython-string-split-method/),将用作分隔符的字符串作为输入参数,并返回由分隔符分割的子字符串列表。分隔符不包含在结果中,因此,我们将得到一个干净的列表,在这个列表中,每个子字符串都对应着一个“参数-值”对。
    请注意,由于split函数是一个字符串方法,所以我们在调用它时需要使用包含查询参数的字符串变量。在这个示例中,该字符串是qs_parse函数的输入参数,我们称之为qs。



    由于我们要开发一个通用的解析函数,所以假设我们不知道查询中存在多少个参数。因此,我们将使用for …in循环对前面获取的列表元素进行逐个迭代处理。


    kittenblock中小学创客名师推荐的图形化编程软件

    for element in ampersandSplit:
    #iteration code
    


    在每次循环迭代中,元素变量将由每个“参数-值”对构成的字符串赋值,字符串格式为“参数=值”。我们已经知道,参数和值由“=”字符分隔,所以我们可以再次使用split函数,使用“=”字符作为分隔符进一步分割字符串。



    由于我们采用的是逐对重复处理的方式,所以我们知道此操作的输出结果将始终是一个具有两个位置的列表。第一个位置是参数的名称(它是分隔符字符左侧的子字符串),第二个位置是其值(它是分隔符字符右侧的子字符串)。
    考虑到这一点,我们只需将结果列表的第一个元素映射到字典的键(key),将第二个元素映射到字典的值(value)。请记住,MicroPython索引号是从零开始的,因此列表第一个和第二个元素的索引号分别为0和1。

    kittenblock中小学创客名师推荐的图形化编程软件

    parameters[equalSplit[0]] = equalSplit[1]
    


    在代码的最后,我们将返回字典,它存储在parameters变量中。


    kittenblock中小学创客名师推荐的图形化编程软件

    
    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(我对函数使用了相同的名称,但它可能有所不同),因此稍后我需要将其作为模块导入,以便能够使用已开发的函数。在上传之后,为了测试一切,我们可以使用以下代码。


    kittenblock中小学创客名师推荐的图形化编程软件

    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)
    他写了很多有关ESP32ESP8266的有用的教程和项目。


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



    打赏作者鼓励一下!
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    请问一下微动开关 4X4矩阵键盘 16按键  怎么接ardiuno的 接口?
    请问一下微动开关 4X4矩阵
    请问下这款微动开关 4X4矩阵键盘 16按键的 8个接口分别接单片机的什么口,我
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    Nano 一直显示上传,不显示上传成功。
    Nano 一直显示上传,不显
    前面用的还好好的,突然就传不上程序了。一直停留在上传状态中,就是不限显示上传成功
    【项目】基于Arduino Nano的多功能桌面感应垃圾桶
    【项目】基于Arduino Nano
    基于Arduino Nano的多功能桌面感应垃圾桶随着大学生活不断往前迈进,宿舍桌面上的杂物
    Arduino板接74HC拓展接驱动器接多个四项电机
    Arduino板接74HC拓展接驱
    一个Arduino板能不能接多个74HC595来得到多个拓展? 如果能的话要怎么接啊? 如果接
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表