ESP32发HTTPS POST控制KASA智能插座返回JSON错误排查
问题根因
请求失效由两处代码写法错误导致,核心触发JSON format error的是JSON转义逻辑问题:
- 嵌套JSON转义不符合要求:你代码中POST请求体的
requestData是嵌套在JSON结构里的字符串类型字段,当前写法没有对该字段内部的双引号做正确转义:
错误写法片段:
这段代码里,"requestData": "{"system":{"set_relay_state":{"state":0}}}"{前的双引号会直接提前结束requestData的字符串值,后面的内容会被JSON解析器识别为非法结构,直接报格式错误。由于这是C代码中定义的、要发送给服务端的JSON字符串,内部嵌套JSON的双引号需要做双重转义:C字符串中要输出供JSON解析的转义双引号\",需要写成\\\"(两个反斜杠在C++里会被解析为一个反斜杠,和后面的引号组合成JSON需要的转义引号)。
正确写法片段:"requestData":"{\\\"system\\\":{\\\"set_relay_state\\\":{\\\"state\\\":0}}}" - 服务器地址配置冗余:你定义的
serverName变量末尾多写了HTTP/1.1,该字段是ESP32 HTTPClient库底层自动拼接的HTTP协议版本标识,手动写在URL末尾会导致请求路径异常,虽然本次没有触发HTTP层错误,但属于不规范写法,需要删除。 - 补充说明:你当前注释掉了CA证书校验逻辑,测试阶段可以临时跳过证书验证连通性,正式使用建议加载对应服务端根证书,避免连接劫持和部分场景下的TLS握手异常。
可行调试方向
- 打印实际发送的请求内容:不要仅核对代码里写的静态字符串,在调用
http.POST()前,把你构造的完整请求体通过串口打印输出,复制到JSON校验工具中验证格式,确认运行时实际生成的字符串和你用cURL、API测试工具验证可用的请求体完全一致。 - 本地抓包对比请求:在局域网内搭建简易HTTP测试服务,将ESP32的请求目标临时改为该测试服务地址,抓取ESP32发出的完整请求头、请求体,和你之前验证可用的请求逐字段对比,可快速定位字段缺失、格式错误、Header配置错误等问题。
- 用JSON库替代手动拼接字符串:对于多层嵌套的JSON请求,不要手动写字符串拼接和转义,直接使用结构化JSON库构造请求:先创建外层JSON对象,将内层的控制指令序列化为字符串后赋值给
requestData字段,库会自动处理所有转义逻辑,从根源上避免手动写转义符的低级错误。
内容的提问来源于stack exchange,提问作者shark24
相关产品推荐
相关产品推荐

