Pico 用 urequests 发 HTTP 请求:从 DHCP 拿 IP 到完整客户端实现
向 httpbin.org 的测试端点发送 GET 请求后,MicroPython urequests 返回的状态码为 200,且 JSON 里包含 origin 与 headers 字段。Pico 先通过 DHCP 拿到动态 IP,再用同一套代码完成 POST、PUT、DELETE 等方法验证,整个流程无需手动配置网络参数。
这套组合让 Raspberry Pi Pico 在嵌入式场景下快速变成能跟云端交互的设备。很多初学者卡在第一步:板子连不上网。解决办法就是先让它自动拿 IP,再用 urequests 发请求。整个过程代码量不大,却覆盖了真实项目里最核心的几环。
DHCP 成功获取 IP 是 Pico 发起 HTTP 请求的前提
MicroPython 在 Pico 上运行网络功能前,必须先获得合法 IP 地址。手动写死 IP 地址虽然可行,但每次换环境都要改代码,非常麻烦。DHCP 协议正是为此设计的,它能让设备自动从路由器获取 IP、子网掩码、网关和 DNS。
具体代码实现时,先导入 network 模块,然后创建 WLAN 接口并激活它。接着调用 connect 方法连接 Wi-Fi,之后进入一个循环不断检查是否连接成功。判断逻辑通常是 while not wlan.isconnected(): time.sleep(1),一旦连接成功就打印网络配置信息。
如果 DHCP 获取成功,会看到类似 ip=192.168.1.XXX 的输出,这表明 Pico 已经拿到动态分配的网络参数。此时就可以安全地导入 urequests 并发起 HTTP 请求。没有这一步,后续所有网络操作都会直接报错 ConnectionError 或 Timeout。
实际测试中,DHCP 过程通常在几秒到十几秒内完成。信号显示,如果获取成功则使用动态分配的网络配置,否则需要排查 Wi-Fi 密码、信号强度或路由器 DHCP 池是否已满。这些判断逻辑是整个 HTTP 客户端实验的基础,前置条件不满足,后面的 urequests 调用毫无意义。
这一步看似简单,却直接决定了项目能否在不同家庭或办公室环境里即插即用。很多初学者把时间浪费在硬编码 IP 上,而正确做法是让 DHCP 接管,代码更干净,移植性也更好。(本节约 380 字)
urequests 库把 request 方法封装成标准 HTTP 调用
urequests 是 MicroPython 内置的简化版 requests 库。它把底层 socket 操作封装成几个常用方法,让开发者可以用类似 PC 端 Python 的写法发起 HTTP 请求。
核心用法是 urequests.request(method, url, **kwargs)。method 参数直接传入字符串 ‘GET’、‘POST’、‘PUT’、‘DELETE’ 等。url 就是目标地址,这里统一使用 http://httpbin.org 作为测试服务。它提供了各种 HTTP 方法的测试端点,能立刻返回对应的响应。
库内部会自动处理连接建立、请求头拼接、响应读取等细节。调用后返回一个 response 对象,包含 status_code、headers、text 和 json() 方法。开发者不需要关心 TCP 握手或分包,只需关注业务数据。
在 Pico 上使用时,通常先确保网络已连通,再 import urequests。整个库体积小,适合资源受限的微控制器。信号中的实验正是用这套封装对 httpbin.org 进行全面测试,验证了从 GET 到 DELETE 的全套方法均能正常工作。
urequests 的设计目标是保持接口与标准 requests 尽量一致,这让有 Python 网页开发经验的人能快速上手。同时它也做了嵌入式优化,比如默认超时处理和内存友好的响应读取方式。这些特性让它成为 Pico HTTP 客户端的首选实现。(本节约 360 字)
httpbin.org 的 /get 与 /post 端点直接返回请求镜像
httpbin.org 是一个专门用来测试 HTTP 客户端的公开服务。它最实用的特性是会把收到的请求内容原样返回,方便开发者立刻看到自己发出去的请求长什么样。
访问 /get 端点时,urequests.get(‘http://httpbin.org/get') 会返回状态码 200,JSON 主体里包含 origin(客户端 IP)、headers(请求头)和 args(查询参数)。这相当于一面镜子,能立刻验证 Pico 是否正确连接到互联网,以及请求头是否符合预期。
/post 端点则用于测试带数据的请求。发送 POST 后,响应里的 json 或 form 字段会把客户端提交的内容完整返回。通过对比发送前后的数据,可以快速确认编码、Content-Type 是否正确。
实验中还依次测试了 /put 和 /delete 端点。每个端点都返回相似的结构化 JSON,包含 method 字段表明服务器收到的 HTTP 方法。这套机制让开发者不用自己搭建服务器就能完成端到端验证。
对初学者来说,这比直接调用生产接口安全得多。出错时能立刻看到完整的请求镜像,避免把调试流量打到真实业务服务器上。信号明确指出该服务提供了 GET、POST、PUT、DELETE 等多种方法的测试端点,正是整个实验的核心验证平台。(本节约 350 字)
POST 请求必须正确传递 data 与 headers 参数
GET 请求通常不需要 body,而 POST、PUT 这类方法必须正确传递数据。urequests 对此提供了两个常用参数:data 和 json。
data 用于发送表单或字符串,json 用于直接传 Python 字典,库会自动序列化为 JSON 并设置 Content-Type: application/json。实验中对 /post 端点的调用演示了两种写法:一种是 data=‘key=value’,另一种是 json={‘key’: ‘value’}。
headers 参数同样重要。如果不显式设置 Content-Type,服务器可能无法正确解析 body。常见做法是 headers={‘Content-Type’: ‘application/json’} 或 ‘application/x-www-form-urlencoded’。信号中的测试用例把这些参数组合使用,验证了不同配置下的返回结果。
与 GET 请求相比,POST 的实现细节多了参数准备、编码和可能的超时控制。Pico 内存有限,发送较大 JSON 时需要注意避免一次性构造过大的字符串。实际代码中通常会把数据准备好后再一次性传入 urequests.post(url, json=payload, headers=headers)。
DELETE 和 PUT 的参数传递方式与 POST 高度相似,只是 method 不同。整个实验用同一套模板代码,只改 method 和对应参数,就完成了全部方法验证。这体现了 urequests 接口设计的一致性,也降低了初学者的认知负担。(本节约 340 字)
IP 获取失败或超时是初学者最常见的连接错误
实际调试中,最频繁出现的问题是 urequests 调用直接抛出 OSError: [Errno 110] ETIMEDOUT 或 ConnectionError。这些错误大多源于 DHCP 阶段失败。
排查第一步是检查 wlan.isconnected() 的返回值和 wlan.ifconfig() 的输出。如果长时间卡在连接循环里,可能是 Wi-Fi SSID 或密码写错,也可能是 Pico 天线信号太弱。信号中的 DHCP 实验明确指出,成功时会使用动态分配的网络配置,否则需要进一步调试。
第二步是增加超时判断。可以在循环里加入计时,超过 30 秒仍未连接就主动报错并打印 wlan.status() 的错误码。常见状态码含义包括 -1(未连接)、-2(认证失败)等。
HTTP 阶段的超时则需要给 urequests 传递 timeout 参数,比如 urequests.get(url, timeout=10)。Pico 在弱网环境下很容易触发默认超时,适当调大这个值能提高成功率,但也不能无限大,否则会长时间阻塞主线程。
另外要注意 MicroPython 版本差异,不同固件对 network 模块的支持程度不同。建议使用最新稳定版固件,并确保 urequests 模块已包含在内。结合两个信号的实验现象,IP 获取失败是所有后续错误的根源,务必先把这一步走通。(本节约 330 字)
实际项目需额外处理响应解析与内存限制
实验验证通过后,真正落地到项目时还有几点需要注意。首先是响应解析。httpbin.org 返回的是结构化 JSON,实际接口可能是纯文本、XML 或二进制。urequests.response.json() 虽然方便,但遇到超大响应时可能耗尽 Pico 的内存。
建议采用流式读取方式:response = urequests.get(url, stream=True),然后分块读取 content。或者直接使用 response.text 后手动解析,减少中间对象占用。
内存限制是 Pico 开发绕不开的话题。每次请求后必须调用 response.close() 释放连接,否则容易出现内存碎片导致后续请求失败。实际项目中通常会把 HTTP 客户端封装成类,统一管理会话和资源释放。
此外,生产环境需要加入重试机制。网络抖动在嵌入式场景很常见,简单实现可以是 for _ in range(3): try: r = urequests.get(…) break except: time.sleep(2)。
安全方面,实验使用 http 明文,实际项目建议切换到 urequests 支持的 https(需固件包含 SSL 支持)。证书验证、Token 管理、请求频率控制都是后续要补齐的内容。
对中文初学者来说,最好的练习路径是先跑通本文所有示例,再逐步替换成自己的业务接口。从 DHCP 配置到完整请求再到错误处理,形成闭环后,Pico 就真正具备了联网能力,可以对接各种云平台或自建服务。
整个流程代码简洁,逻辑清晰,适合作为嵌入式网络开发的入门模板。后续可以继续扩展 WebSocket、MQTT 等更高层协议,让 Pico 在物联网项目中发挥更大价值。(本节约 420 字)
参考来源
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/geek001/post/20260902/Pico-%E7%94%A8-urequests-%E5%8F%91-HTTP-%E8%AF%B7%E6%B1%82%E4%BB%8E-DHCP-%E6%8B%BF-IP-%E5%88%B0%E5%AE%8C%E6%95%B4%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%AE%9E%E7%8E%B0/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com