You need to enable JavaScript to run this app. 如何使用ESP8266向Heroku API发送GET/POST请求?连接异常如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

如何使用ESP8266向Heroku API发送GET/POST请求?连接异常如何解决?

问题核心原因

你遇到的Exception(9)是ESP8266的未对齐内存访问崩溃,触发崩溃的核心原因有两个:

  1. 未配置WiFiClientSecure的证书校验策略,ESP8266的WiFiClientSecure库默认强制校验HTTPS站点证书,未配置的情况下连接会触发内存访问异常
  2. 构造的GET请求有语法错误,空格缺失/多余会导致服务端无法解析请求,后续读取逻辑异常也会触发崩溃

具体修复步骤

1. 调整证书校验规则

有两种可选方案:

  • 安全方案:添加Heroku使用的Let's Encrypt ISRG Root X1根证书做校验,适合生产环境
  • 调试方案:临时关闭证书校验,可快速验证功能,本次修复先用这个方案
    只需要在connect调用前添加一行httpsClient.setInsecure();即可。

2. 修复HTTP请求格式错误

原有请求有两处语法问题:

  • GET和请求路径之间没有空格
  • HTTP/1.1中间多了多余空格
    修正后的请求构造逻辑如下。

3. 补充连接失败判断逻辑

原有代码无论连接是否成功都会执行请求发送,连接失败时调用写接口会触发空指针访问,需要把请求逻辑放到连接成功分支,连接失败时直接释放资源返回。

完整修改后的代码片段

void callhttps () {
  WiFiClientSecure httpsClient;
  httpsClient.setTimeout(15000);
  // 关闭证书校验,生产环境建议替换为setCACert配置根证书
  httpsClient.setInsecure();
  delay(1000);
  int retry = 0;
  while ((!httpsClient.connect(host, httpsPort)) && (retry < 15)) {
    delay(100);
    Serial.print(".");
    retry ++;
  }
  if (retry == 15) {
    Serial.println("Connection failed");
    httpsClient.stop();
    return;
  }
  Serial.println("Connected to Server");
  // 修正后的标准HTTP请求格式
  httpsClient.print(String("GET ") + path + 
                    " HTTP/1.1\r\n" +
                    "Host: " + host +
                    "\r\n" + "Connection: close\r\n\r\n");
  while (httpsClient.connected()) {
    String line = httpsClient.readStringUntil('\n');
    if (line == "\r") {
      break;
    }
  }
  while (httpsClient.available()) {
    datarx += httpsClient.readStringUntil('\n');
  }
  Serial.println(datarx);
  datarx = "";
  httpsClient.stop();
}

额外优化建议

  • 生产环境使用时可以替换setInsecure为setCACert传入对应根证书,保证通信安全
  • crontimer变量建议改为unsigned long类型,避免millis()溢出后判断逻辑出错
  • 每次请求结束主动调用stop()释放客户端资源,避免内存泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 21:54:01