STM32+MbedTLS连接Firebase DB时PUT请求返回400错误排查
排查PUT请求400错误的关键点
1. 确认Content-Length头的准确性
Firebase DB严格依赖Content-Length识别请求体完整性,需重点检查:
- 计算JSON请求体的字节数(注意UTF-8编码的多字节字符,不能直接按字符数统计)
- 确保请求头中
Content-Length的值与实际发送的请求体字节数完全一致 - 排查是否误将字符串长度当作字节数计算,这是嵌入式场景的常见错误
2. 验证JSON格式合法性
微小的格式错误都会导致Firebase拒绝请求:
- 用本地JSON校验工具检查数据,确保无遗漏引号、逗号,所有键名用双引号包裹
- 将构造好的请求体转成十六进制打印,排查是否存在内存脏数据或不可见字符
3. 检查MbedTLS发送请求体的逻辑
嵌入式场景易出现请求体截断或未发送的情况:
- 确认调用
mbedtls_ssl_write()时,是否循环发送直到全部请求体字节发送完成(该函数可能分多次返回,需判断返回值累计是否等于请求体长度) - 检查请求头结束后是否正确插入两个连续换行符(
\r\n\r\n),这是HTTP头与请求体的分隔标志,缺失会导致服务器无法识别请求体 - 无需在JSON末尾额外添加换行,反而会干扰长度计算
4. 核对Firebase DB的PUT端点规则
- 确认PUT的URL路径指向具体节点(如
https://xxx.firebaseio.com/test.json),路径错误会导致服务器无法识别请求体接收位置 - 请求头
Content-Type必须设为application/json,改用application/x-www-form-urlencoded不符合Firebase要求
关键代码检查示例
构造请求时需重点确认字节数计算和发送逻辑:
// 示例:正确计算JSON字节数并构造Content-Length头 char json_buf[128] = "{\"temp\":25.5,\"status\":\"ok\"}"; // 若包含非ASCII字符,确保内存中是UTF-8编码,strlen可正确统计字节数 int json_len = strlen(json_buf); char content_len_header[32]; snprintf(content_len_header, sizeof(content_len_header), "Content-Length: %d\r\n", json_len);
发送阶段需先发送完整请求头,再发送分隔符\r\n\r\n,最后循环发送请求体。
内容的提问来源于stack exchange,提问作者l.g.oasis
相关产品推荐
相关产品推荐

