You need to enable JavaScript to run this app. ESP8266运行MicroPython时urequests.post请求Flask接口报错
优惠活动
大模型
产品
解决方案
定价
更多

ESP8266运行MicroPython时urequests.post请求Flask接口报错

问题根因定位

服务端抛出的“视图函数返回无效响应”报错,本质是demo_post接口里request.get_json()拿到的解析结果为None,后续代码执行return content时就等于返回了None,直接触发Flask的响应校验错误。
为什么同一份POST请求,普通Python的requests库能正常跑通,MicroPython的urequests就会出问题,核心是两个库的行为差异:

  • 标准requests库在传入json参数时,会自动完成两个操作:
    • 将传入的字典序列化为JSON格式字符串作为请求体发送
    • 自动给请求头追加Content-Type: application/json标识
  • MicroPython实现的urequests存在简化逻辑:传入json参数时仅会把字典序列化成JSON字符串塞进请求体,不会自动设置Content-Type: application/json请求头
  • Flask的request.get_json()默认会校验请求头的类型,如果识别不到application/json的标识,就不会主动解析请求体,直接返回None

这个差异也能匹配之前的测试现象:MicroPython发GET请求能正常跑通,是因为GET请求不需要携带请求体、也不需要匹配的Content-Type头,完全不会触发这个解析问题;而普通Python的requests因为自动补了请求头,所以POST传json的流程是完整的。


可直接落地的修复方案

二选一即可实现正常通信:

方案1:修改MicroPython端调用逻辑(改动最小,推荐)

发POST请求时手动补上缺失的Content-Type请求头,代码调整为:

urequests.post(
    'https://example.com/demo',
    json={"a":5,"b":4},
    headers={"Content-Type": "application/json"}
).json()

方案2:放宽Flask服务端的JSON解析校验

如果不想改嵌入式端的代码,可以把服务端的JSON解析逻辑改成跳过Content-Type校验的模式,只要请求体是合法JSON就会被正常解析:

@app.route('/demo', methods = ['POST'])
def demo_post():
    # force=True: 跳过请求头Content-Type校验,直接解析请求体;silent=True: 解析失败不抛异常直接返回None
    content = request.get_json(force=True, silent=True)
    print(content)
    return content

额外排查提示

  • 修改代码后如果还是拿不到解析值,可以在接口里加一行打印print(request.data),确认ESP8266端确实把JSON数据完整发出来了,排除网络传输丢包的问题。
  • 不要在MicroPython端手动把字典转成字符串再通过data参数传请求,容易因为编码格式不兼容导致解析失败,用urequests自带的json序列化能力配合手动加请求头是最稳定的实现方式。

内容的提问来源于stack exchange,提问作者pp7sec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 01:15:08