2019-3-28 15:31:02 [显示全部楼层]
1871浏览
查看: 1871|回复: 1

[ESP32系列教程] ESP32 MicroPython教程:在Picoweb app上获取查询参数

[复制链接]
简介
本文esp32 教程,主要介绍如何获取发送给Picoweb app的HTTP请求的查询参数。我们将使用上篇帖子:中开发的解析器获取MicroPython字典格式的参数值。

请注意,为使代码尽可能简单,我们假设客户端总是发送正确格式的请求参数,并不对此进行任何验证。当然,在实际应用中,必须考虑所有的错误情况,在使用之前应该检查参数是否有效以及格式是否正确等等。

测试使用的是一个集成sp - wroom -32模块的开发板:FireBeetle ESP32。代码开发是在MicroPython IDE uPyCraft上完成的。



代码
首先需要导入picoweb和network模块,它们分别是创建HTTP服务器app和将ESP32连接到WiFi网络所需要的。
  1. import picoweb
  2. import network
复制代码


然后,我们将声明一个查询字符串解析函数,用于获取MicroPython字典格式的查询字符串参数。该函数相关代码已在上篇帖子:ESP32 MicroPython教程:开发一个简单的URL查询字符串解析器 中详细解释,此处不再赘述。


请注意,为简单起见,本例将直接使用解析函数代码,但是最好的做法是将这些代码封装到一个单独的模块里并在此处导入使用,以实现最清晰的代码结构。
  1. def qs_parse(qs):
  2.   parameters = {}
  3.   ampersandSplit = qs.split("&")
  4.   for element in ampersandSplit:
  5.     equalSplit = element.split("=")
  6.     parameters[equalSplit[0]] = equalSplit[1]
  7.   return parameters
复制代码



接下来,使用上一篇教程中的通用代码将ESP32连接到WiFi网络。同样地,这些代码也可以封装到一个模块中,以确保主代码更加简洁。

  1. ssid = "yourNetworkName"
  2. password =  "YourNetworkPass"
  3. station = network.WLAN(network.STA_IF)
  4. station.active(True)
  5. station.connect(ssid, password)
  6. while station.isconnected() == False:
  7.   pass
  8. ip = station.ifconfig()
复制代码

然后,创建我们的app实例并指定负责对请求进行处理的路由(route)。我们将对路由“/query“进行监听。

  1. app = picoweb.WebApp("myApp")
  2. @app.route("/query")
  3. def query(req, resp):
  4.    ##route handling code
复制代码


路由处理函数的第一个输入参数是一个HTTPRequest类的对象,我们在声明参数时将其命名为req。那么为了获取该路由所执行请求的查询字符串,我们只需获取这个对象的qs属性即可。


但是,从这个属性中只能得到未经解析的完整查询字符串,因此需要使用先前声明的解析函数,从而以更有用的格式获取参数及数值。函数的输出是一个字典变量,字典的键就是URL查询参数名,而数值就是相应的URL查询参数值。

  1. queryString = req.qs
  2. parameters = qs_parse(queryString)
复制代码

我们将假设接收两个查询参数,一个叫做param1,另一个是param2。这样,我们就能根据字典的键从URL查询字符串中得到相应的数值。


为使代码尽可能简短,我们假设客户端正确地发送了这些参数,因此我们不会进行任何验证(比如确认键是否存在于字典中)。


当然, 在实际的应用中,我们理应采取这种防护措施。您可以参考这篇文章:ESP32 / ESP8266 MicroPython教程:如何使用字典 如何获取MicroPython字典中所有可用键的说明,以便对其进行验证。


为了确认一切正常,我们将只把查询字符串中的参数值发送回客户端。如上所述,我们可以从字典中轻松得到这些值。
  1. yield from picoweb.start_response(resp)
  2. yield from resp.awrite("Parameter 1 value: " + parameters["param1"] + "\n")
  3. yield from resp.awrite("Parameter 2 value: " + parameters["param2"])
复制代码


最后,调用app实例的run方法,将其绑定到连接WiFi网络时所分配的IP。最终的源代码(包括该调用)如下所示。
  1. <div align="left">import picoweb</div><div align="left">import network
  2. #### Parsing function
  3. def qs_parse(qs):
  4.   parameters = {}
  5.   ampersandSplit = qs.split("&")
  6.   for element in ampersandSplit:
  7.     equalSplit = element.split("=")
  8.     parameters[equalSplit[0]] = equalSplit[1]
  9.   return parameters
  10. #### WiFi Connection
  11. ssid = "yourNetworkName"
  12. password =  "YourNetworkPass"
  13. station = network.WLAN(network.STA_IF)
  14. station.active(True)
  15. station.connect(ssid, password)
  16. while station.isconnected() == False:
  17.   pass
  18. ip = station.ifconfig()
  19. #### Picoweb app
  20. app = picoweb.WebApp("myApp")
  21. @app.route("/query")
  22. def query(req, resp):
  23.     queryString = req.qs
  24.     parameters = qs_parse(queryString)
  25.     yield from picoweb.start_response(resp)
  26.     yield from resp.awrite("Parameter 1 value: " + parameters["param1"] + "\n")
  27.     yield from resp.awrite("Parameter 2 value: " + parameters["param2"])
  28. app.run(debug=True, host =ip[0])</div>
复制代码


测试代码
只需将代码上传到ESP32并运行,即可对其进行测试。代码执行完成后,我们的Picoweb app根节点将会打印到控制台上。请将该URL复制粘贴到浏览器中,并为其补齐路由和查询参数。


在图1所示的示例中,我将param1设为数值10,param2设为字符串“abc”。在URL浏览器地址栏中回车后,您就会得到类似的输出,其中显示了所返回的正确参数值。



esp32-micropython-picoweb-accessing-query-string-parameters.png

图1 - 指定路由的请求输出(显示所发送的查询参数值)。


注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。
他写了很多有关ESP32、ESP8266的有用的教程和项目。

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

gada888  版主

发表于 2019-4-1 08:34:51

学习了
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail