2018-11-14 18:10:11 [显示全部楼层]
3961浏览
查看: 3961|回复: 0

[ESP32系列教程] ESP32 / ESP8266 MicroPython教程:HTTP GET请求

[复制链接]
MicroPython教程旨在阐释如何借助urequests模块用MicroPython执行HTTP GET请求。本教程在ESP8266ESP32MicroPython上均进行了测试。

简介


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


重要提示:本文撰写之际,所用的MicroPython版本内含urequests模块。请注意,此情况或有变化,之后版本的默认配置可能不会包含该模块,你需要先进行手动安装。
当然,为适用本教程,我们首先需要连接到WiFi网络,以便访问互联网,教程:ESP32 MicroPython教程:连接Wi-Fi网络,本教程将不再赘述如何连接WiFi网络。如果你想自动连接,请参阅这篇详细指南:ESP32 / ESP8266 MicroPython教程:自动连接WiFi


我们将通过连接MicroPython提示符并一次发送一个命令来运行代码。如果你愿意的话,可以在脚本中编写命令并从你的计算机运行该脚本,教程:ESP32 / ESP8266 MicroPython教程:从计算机运行脚本。另一个选择是将脚本上传到MicroPython的文件系统并从提示符运行该脚本,如此处所述:ESP32 / ESP8266 MicroPython教程:从文件系统运行脚本


我将使用Putty连接到提示符,但你可以使用其他能够建立串行连接的软件。如果你尚未在ESP32上配置MicroPython,请参阅这篇之前的帖子:
ESP32教程:MicroPython支持
。如果你使用的是ESP8266,请参阅此帖(https://techtutorialsx.com/2017/05/03/esp8266-micropython-support/)。
  

代码

首先,连接到WiFi网络后,我们将导入urequests模块,该模块包含本教程所需的所有函数。
  1.    import urequests
复制代码
接下来,为了执行实际的HTTP GET请求,我们只需调用urequests模块的get函数(https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py#L100),并将请求目标的URL作为输入值传递。此处将用到一个假的在线REST API的网站,我曾在多个教程中使用过这个网站。 我们要通过HTTP GET请求访问的网站URL是http://jsonplaceholder.typicode.com/albums/1,你可以通过在web浏览器上访问该网站来查看预期结果。访问该网站时,你应该会得到类似于图1的内容,这是虚拟相册对象的JSON结构。


Figure 1 – Expected output of a HTTP GET request..png
图1 - HTTP GET请求的预期输出结果。

以下代码用于执行上述来自MicroPython的GET请求。调用get函数将返回一个Response类(https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py#L3)的对象。
  1.    response = urequests.get('http://jsonplaceholder.typicode.com/albums/1')
  2.    print(type(response))
复制代码
如图2所示,返回的对象确实属于Response类。
Figure 2 – Class of the object returned by the call to the get method..png
图2 - 调用get方法返回的对象的类。

现在,要访问HTTP请求响应的实际内容,我们只需访问其text属性(https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py#L25),如下所示。
  1.     print(response.text)
  2.     print(type(response.text))
复制代码
此命令的预期输出如图3所示。

Figure 3 – Printing the response of the HTTP GET request..png
图3 - 打印HTTP GET请求的响应。

请注意,此属性会返回包含内容的字符串。然而,正如我们所看到的,请求的响应是以JSON格式返回的。因此,如果愿意的话,我们可以访问json属性(https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py#L28),该属性会返回包含已解析内容的字典。
  1.    parsed = response.json()
  2.    print(type(parsed))
复制代码
这些命令的结果如图4所示。这证实了我们的结果确实是一个Python字典。

Figure 4 – Obtaining the JSON content of the response parsed..png

图4 - 获取响应的已解析JSON内容。

从库的源代码(https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py#L28)中可以看出,此属性借助ujson库来解析内容。你可以在之前的文章中了解更多有关ujson解析的信息。既然我们已经解析了对象,那么就可以通过字典对象上值的键来获取每个单独的JSON值。
  1.    V print(parsed["userId"])
  2.    print(parsed["id"])
  3.    print(parsed["title"])
复制代码
获取JSON结构各个值的结果如图5所示。该结果与从text属性获得的JSON结构一致。
Figure 5 – Accessing the values of the JSON structure via Python dictionary..png
图5 - 通过Python字典获取JSON结构的值。

另一个检索请求响应内容的有趣方法是使用以字节为单位返回响应的content属性:https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py#L17
  1.    print(response.content)
  2.    print(type(response.content))
复制代码
请参见图6所示的命令结果。
Figure 6 – Response of the HTTP GET request as bytes..png
图6 –HTTP GET请求的响应(以字节为单位)。

最后,我们还要获取状态代码该代码的原因文本。为此,我们将使用status_code和reason属性,如以下代码所示。
  1.   print(response.status_code)
  2.   print(response.reason)
复制代码
图7展示了这些命令的结果。注意,结果包含一个代码200,其对应于HTTP中的“OK”代码。

Figure 7 – Getting the HTTP status code and reason..png
图7 - 获取HTTP状态代码和原因。

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

查看更多ESP32/ESP8266教程和项目,请点击 : ESP32教程 汇总贴
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

硬件清单

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

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

mail