使用SIM800L模块向云函数发送HTTPS POST请求报400错误求助
排查NODEMCU-32S通过SIM800L发送HTTPS POST返回400 Bad Request问题
使用NODEMCU-32S微控制器,通过SIM800L GPRS模块向云函数服务器发送HTTPS POST请求时,可成功连接服务器,但无法发送数据,返回400 Bad Request错误。以下是相关代码:
SerialMon.println("Performing HTTP POST request..."); String httpRequestData = String(requestBody) +""; client.print(String("POST ") + resource + " HTTP/1.1\r\n"); client.print(String("Host: ") + server + "\r\n"); client.println("Connection: close"); client.println("Content-Type: application/json"); client.print("Content-Length: "); client.println(httpRequestData.length()); client.println(); client.println(httpRequestData); timeout = millis(); while (client.connected() && millis() - timeout < 10000L) { while (client.available()) { char c = client.read(); SerialMon.print(c); timeout = millis(); } }
输出截图显示服务器返回HTTP/1.1 400 Bad Request响应,无有效数据传输。
排查与解决思路
1. 检查请求体格式合法性
400错误大多源于请求格式不符合服务器要求,重点确认:
requestBody是否为标准JSON格式,比如是否存在语法错误(缺失引号、逗号不匹配、括号不闭合)。可先将requestBody内容打印到串口,复制到在线JSON校验工具验证。- 若
requestBody为空或未初始化,空JSON请求会触发服务器校验失败。
2. 修正Content-Length计算逻辑
代码中用httpRequestData.length()获取字符数作为Content-Length,但HTTP协议要求的是字节数:
- 若JSON包含中文或非ASCII字符,字符数和字节数会不一致,导致服务器解析失败。
- 解决方法:改用字节数组计算长度并发送数据:
byte postDataBytes[httpRequestData.length()]; httpRequestData.getBytes(postDataBytes, sizeof(postDataBytes)); client.print("Content-Length: "); client.println(sizeof(postDataBytes)); client.println(); client.write(postDataBytes, sizeof(postDataBytes));
3. 确认请求头与路径正确性
- 云函数服务器可能需要额外请求头(如
Authorization令牌、User-Agent),检查服务器文档是否有必填字段遗漏。 - 确保
resource路径完整正确,比如是否包含云函数的完整路由(如/api/function-name),路径拼写错误会直接触发400。
4. 排查SIM800L的HTTPS兼容性
SIM800L对HTTPS支持有限,需确认:
- 是否加载了对应云服务的根证书,未加载合法CA证书可能导致HTTPS连接存在数据篡改或截断问题。
- 尝试改用HTTP请求测试(若服务器支持),排除HTTPS层的兼容性问题。
5. 打印完整请求内容调试
在发送请求前,将完整HTTP请求打印到串口,用Postman或curl手动模拟该请求,验证是否能正常响应:
SerialMon.println("Full HTTP Request:"); SerialMon.println(String("POST ") + resource + " HTTP/1.1"); SerialMon.println(String("Host: ") + server); SerialMon.println("Connection: close"); SerialMon.println("Content-Type: application/json"); SerialMon.print("Content-Length: "); SerialMon.println(httpRequestData.length()); SerialMon.println(); SerialMon.println(httpRequestData);
内容的提问来源于stack exchange,提问作者udaya shankar kanuri
相关产品推荐
相关产品推荐

