You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:01:27