本MicroPython教程旨在阐释如何借助urequests模块用MicroPython执行HTTP GET请求。本教程在ESP8266和ESP32的MicroPython上均进行了测试。简介

本MicroPython教程旨在阐释如何借助urequests模块用MicroPython执行HTTP GET请求。本教程在ESP32和ESP8266的MicroPython上均进行了测试。下文所示数据出自上的测试,但ESP8266的测试结果与之相差无几。你可以在这里(https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py)访问库的源代码。

重要提示:本文撰写之际,所用的MicroPython版本内含urequests模块。请注意,此情况或有变化,之后版本的默认配置可能不会包含该模块,你需要先进行手动安装。

当然,为适用本教程,我们首先需要连接到WiFi网络,以便访问互联网。本教程将不再赘述如何连接WiFi网络。如果你想手动连接,请参阅这篇(http://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=272122)详细指南。

我们将通过连接MicroPython提示符并一次发送一个命令来运行代码。如果你愿意的话,可以在脚本中编写命令并从你的计算机运行该脚本,如此处(翻译中)所述。另一个选择是将脚本上传到MicroPython的文件系统并从提示符运行该脚本,如此处(https://www.dfrobot.com/index.php?route=DFblog/blogs)所述。

我将使用Putty连接到提示符,但你可以使用其他能够建立串行连接的软件。如果你尚未在ESP32上配置MicroPython,请参阅这篇(http://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=271932)之前的帖子。如果你使用的是ESP8266,请参阅此帖(https://techtutorialsx.com/2017/05/03/esp8266-micropython-support/)。

代码

首先,连接到WiFi网络后,我们将导入urequests模块,该模块包含本教程所需的所有函数。

[mw_shl_code=applescript,true]1   import urequests[/mw_shl_code]

接下来,为了执行实际的HTTP GET请求,我们只需调用urequests模块的get函数,并将请求目标的URL作为输入值传递。此处将用到一个假的在线REST API的网站,我曾在多个教程中使用过这个网站。我们要通过HTTP GET请求访问的网站URL是,你可以通过在web浏览器上访问该网站来查看预期结果。访问该网站时,你应该会得到类似于图1的内容,这是虚拟相册对象的JSON结构。


Figure 1 – Expected output of a HTTP GET request..png (4.49 KB, 下载次数: 18)
2018-12-14 15:27 上传
图1 - HTTP GET请求的预期输出结果。以下代码用于执行上述来自MicroPython的GET请求。调用get函数将返回一个Response类的对象。
[mw_shl_code=applescript,true]1   response = urequests.get('http://jsonplaceholder.typicode.com/albums/1')
2   print(type(response))
[/mw_shl_code]
如图2所示,返回的对象确实属于Response类。

Figure 2 – Class of the object returned by the call to the get method..png (17.2 KB, 下载次数: 19)
2018-12-14 15:27 上传
图2 - 调用get方法返回的对象的类。现在,要访问HTTP请求响应的实际内容,我们只需访问其text属性,如下所示。
[mw_shl_code=applescript,true]1    print(response.text)
2    print(type(response.text))[/mw_shl_code]此命令的预期输出如图3所示。

Figure 3 – Printing the response of the HTTP GET request..png (15.44 KB, 下载次数: 24)
2018-12-14 15:27 上传
图3 - 打印HTTP GET请求的响应。请注意,此属性会返回包含内容的字符串。然而,正如我们所看到的,请求的响应是以JSON格式返回的。因此,如果愿意的话,我们可以访问json属性,该属性会返回包含已解析内容的字典。
[mw_shl_code=applescript,true]1   parsed = response.json()
2   print(type(parsed))[/mw_shl_code]
这些命令的结果如图4所示。这证实了我们的结果确实是一个Python字典。

Figure 4 – Obtaining the JSON content of the response parsed..png (14.51 KB, 下载次数: 22)
2018-12-14 15:27 上传
图4 - 获取响应的已解析JSON内容。从库的源代码中可以看出,此属性借助ujson库来解析内容。你可以在之前的文章中了解更多有关ujson解析的信息。既然我们已经解析了对象,那么就可以通过字典对象上值的键来获取每个单独的JSON值。
[mw_shl_code=applescript,true]1   V print(parsed["userId"])
2   print(parsed["id"])
3   print(parsed["title"])[/mw_shl_code]
获取JSON结构各个值的结果如图5所示。该结果与从text属性获得的JSON结构一致。

Figure 5 – Accessing the values of the JSON structure via Python dictionary..png (12.71 KB, 下载次数: 22)
2018-12-14 15:27 上传
图5 - 通过Python字典获取JSON结构的值。另一个检索请求响应内容的有趣方法是使用以字节为单位返回响应的content属性。
[mw_shl_code=applescript,true]1   print(response.content)
2   print(type(response.content))[/mw_shl_code]
请参见图6所示的命令结果。

Figure 6 – Response of the HTTP GET request as bytes..png (9.12 KB, 下载次数: 21)
2018-12-14 15:27 上传
图6 –HTTP GET请求的响应(以字节为单位)。最后,我们还要获取状态代码和该代码的原因文本。为此,我们将使用status_code和reason属性,如以下代码所示。[mw_shl_code=applescript,true]1  print(response.status_code)
2  print(response.reason)[/mw_shl_code]
图7展示了这些命令的结果。注意,结果包含一个代码200,其对应于HTTP中的“OK”代码。

Figure 7 – Getting the HTTP status code and reason..png (9.84 KB, 下载次数: 22)
2018-12-14 15:29 上传
图7 - 获取HTTP状态代码和原因。
查看更多ESP32/ESP8266教程和项目,请点击 : ESP32教程 汇总贴英文版教程 :