一篇搞懂:MicroPython urequests库与 Pico HTTP 客户端实现

HTTP 客户端实验

这里,我们使用 httpbin.org 作为测试使用的 HTTP 请求和响应服务,它提供了各种 HTTP 方法(GETPOSTPUTDELETE 等)的测试端点,开发者可以在这里快速测试他们的 HTTP 客户端代码。

其主要功能包括:

  • 测试 GET 请求​: 可以发送 GET 请求并查看服务器返回的数据

  • 测试 POST 请求​: 发送 POST 请求,上传数据并查看响应

  • 查看请求头​: 可以查看客户端发送的请求头

  • 模拟延迟​: 可以设置响应的延迟时间,以测试客户端在网络不稳定时的表现

  • 测试文件上传​​: 支持上传文件并查看服务器接收到的文件信息

  • 模拟各种 HTTP 状态码​: 可以返回指定的 HTTP 状态码,方便测试客户端对不同状态码的处理

    以下代码可以在我们提供的资料包中 elegance-devkit v1\Demo\46 ETH_HTTP_Client 文件夹找到。

    注意,进行 ​**HTTP 客户端实验时,需要将 W5500 模块的 网口连接到路由器上才可以正常运行。**

这里,我们使用 Http 协议执行 HTTPGETPOST 请求,并打印请求的状态码和响应数据,示例代码如下所示:

Python 复制代码
# Python env   : MicroPython v1.23.0 on Wiznet W5500
# -*- coding: utf-8 -*-        
# @Time    : 2024/8/8 下午8:14   
# @Author  : 李清水            
# @File    : main.py       
# @Description : 以太网类实验,进行Http客户端测试

# ======================================== 导入相关模块 ========================================

# 导入HTTP请求相关模块
import urequests
# 导入硬件相关模块
from machine import Pin,SPI
# 导入时间相关模块
import time
# 导入网络相关模块
import network

# ======================================== 全局变量 ============================================

# 设备IP地址
ip = '192.168.1.20'
sn = '255.255.255.0'
gw = '192.168.1.1'
dns= '8.8.8.8'
# 用于网络连接的元组对象
netinfo=(ip, sn, gw, dns)

# 定义GET请求的URL
geturl = "http://httpbin.org/get"
# 定义POST请求的URL
posturl = "http://httpbin.org/post"

# ======================================== 功能函数 ============================================

# 初始化网络连接函数
def w5x00_init() -> 'network.WIZNET5K':
    """
​    初始化 network.WIZNET5K 实例,设置静态 IP 地址并进行连接。

​    Returns:
​        network.WIZNET5K: 初始化并连接成功的 network.WIZNET5K 实例。

​    Raises:
​        None: 该函数不抛出异常。
​    """

​    ​# 声明全局变量
    global netinfo

    # 初始化SPI对象
    spi = SPI(0, 2_000_000, mosi=Pin(19), miso=Pin(16), sck=Pin(18))
    # 实例化network.WIZNET5K类,传入使用的片选引脚CS和复位引脚RST
    nic = network.WIZNET5K(spi, Pin(17), Pin(20))
    # 激活网络接口
    nic.active(True)

    try:
        print("\r\nConfiguring DHCP")
        # 尝试使用DHCP动态获取IP地址、子网掩码、网关和DNS服务器等网络配置
        nic.ifconfig('dhcp')
    except:
        print("\r\nDHCP fails, use static configuration")
        # 如果DHCP获取失败,使用静态IP地址配置
        nic.ifconfig(netinfo)

    # 若是没有连接网络,则循环执行
    while not nic.isconnected():
        time.sleep(1)
        # 输出寄存器信息
        print(nic.regs())

    # 打印设置的IP地址
    print('ip :', nic.ifconfig()[0])
    print('sn :', nic.ifconfig()[1])
    print('gw :', nic.ifconfig()[2])
    print('dns:', nic.ifconfig()[3])

    # 返回network.WIZNET5K实例
    return nic

# 发送HTTP请求函数
def request() -> None:
    """
​    发送 HTTP 请求,包括 GET 和 POST 请求,并打印响应结果。

​    Returns:
​        None: 该函数没有返回值。

​    Raises:
​        None: 该函数不抛出异常。
​    """

​    ​# 打印信息,表示开始进行GET请求测试
    print("GET Request test")
    # 发送GET请求,并在URL中附加查询参数
    r = urequests.get(geturl + "?WIZnet=W5100S_W5500")

    # 打印GET请求的响应状态码
    print("Request response code:", r.status_code)
    # 打印GET请求的返回结果中args字段的值
    print("Request response args:", r.json()["args"])

    # 发送POST请求,传递JSON数据
    r = urequests.post(posturl, json={"WIZnet": "W5100S_W5500"})
    # 如果没有收到响应,打印提示信息
    if not r:
        print('spreadsheet: no response received')

    # 打印信息,表示开始进行POST请求测试
    print("\r\nPOST Request test")
    # 打印POST请求的响应状态码
    print("Request response code:", r.status_code)
    # 打印POST请求的返回结果中data字段的值
    print("Request response data:", r.json()["data"])

# ======================================== 自定义类 ============================================

# ======================================== 初始化配置 ==========================================

# 延时3s,等待设备上电
time.sleep(3)
# 打印调试信息
print("FreakStudio : Using W5x00 Ethernet to do HTTP Client test")

# 初始化w5500模块
nic = w5x00_init()

# ========================================  主程序  ===========================================

# 调用request函数,执行HTTP请求测试
request()

request 函数中,我们依次执行以下操作:

  1. 通过 urequests.get() 方法向指定的 URL 发送一个 GET 请求,GET 请求用于从服务器获取数据:
    1. geturl 是一个之前定义好的变量,表示要请求的基础 URL
    2. "?WIZnet=W5100S_W5500" 是查询字符串,会被添加到 URL 的末尾,作为请求参数传递给服务器
    3. 整个表达式的结果会被赋值给变量 r,这个 r 变量是一个 Response 对象,包含了服务器返回的响应信息,如状态码、响应头和响应体等
    4. GET 请求查询参数会被服务器接收并解析,通常放在响应的 args 字段中返回给客户端
  2. 输出 GET 请求的状态码(如 200 表示成功,404 表示未找到等),以便检查请求是否成功,以及服务器如何响应请求:
    1. 200 (OK): ​请求成功
    2. 404 (Not Found): ​资源未找到
    3. 500 (Internal Server Error): ​服务器内部错误
  3. 获取并打印服务器返回的 JSON 数据中的 args 字段,确认服务器正确接收了查询参数并返回预期的数据:
    1. r.json() 方法用于将服务器返回的 JSON 格式响应体解码为 Python 字典
    2. ["args"] 用于从解码后的字典中获取 "args" 键对应的值,在 HTTP 请求中,"args" 通常表示查询参数
  4. 通过 urequests.post() 方法向指定的 URL 发送一个 POST 请求,并传递包含键值对的 JSON 数据, POST 请求用于将数据发送到服务器,例如提交表单或上传文件:
    1. posturl: 要发送请求的 URL 地址
    2. json: 要以 JSON 格式发送的请求数据
    3. {"WIZnet": "W5100S_W5500"} 是一个 Python 字典,表示要以 JSON 格式发送的请求数据
    4. 发送请求的结果会被赋值给 Response 对象 r
  5. 检查 POST 请求是否成功执行。如果没有收到服务器的响应(即 rNone),则打印错误提示信息
  6. 输出 POST 请求的状态码,以检查请求是否成功,服务器是否正确接收了请求并返回响应
  7. 获取并打印服务器返回的 JSON 数据中的 data 字段,以确认服务器正确处理了发送的数据并返回了预期的响应:
    1. r.json() 方法用于将服务器返回的 JSON 格式响应体解码为 Python 字典
    2. ["data"] 用于从解码后的字典中获取 "data" 键对应的值
    3. 服务器在接收到这个 POST 请求后,会解析请求体中的 JSON 数据,并将其放在响应的 data 字段中返回给客户端

烧录代码,打开终端:

可以看到分别打印出了 GET 请求和 POST 请求的响应码和提交的数据内容。

相关推荐
Freak嵌入式1 小时前
一篇搞懂:MicroPython 与 Pico DHCP 动态 IP 的实现与调试
嵌入式
Freak嵌入式1 小时前
保姆级教程:MicroPython+W5500 实现 HTTP 服务器,网页一键控灯
嵌入式
Freak嵌入式1 小时前
【Pico 以太网实战系列 4/6】UDP 协议实操:MicroPython 实现回显服务器
嵌入式
Freak嵌入式1 小时前
MicroPython 以太网实战:Pico+W5500 TCP 客户端详解
嵌入式
Freak嵌入式1 小时前
MicroPython W5500 以太网实验|ping 测试:原理 + 实操全解析
嵌入式
Freak嵌入式5 小时前
USB-CDC 通信实战应用:树莓派 Pico 虚拟串口 + select+MicroPython 全拆解
嵌入式
Freak嵌入式1 天前
PIO 入门:手把手实现板载 LED 闪烁,原理与代码全解析
嵌入式
Freak嵌入式1 天前
一文搞懂树莓派 Pico 任务调度器:基于定时器的 MicroPython 多任务实现
嵌入式
花 满 楼2 天前
国芯科技CCFC3008PCS BIST (内建自测试) 分析总结
mcu·嵌入式·bist