如何使用ESP8266向Heroku API发送GET/POST请求?连接异常如何解决?
问题核心原因
你遇到的Exception(9)是ESP8266的未对齐内存访问崩溃,触发崩溃的核心原因有两个:
- 未配置WiFiClientSecure的证书校验策略,ESP8266的WiFiClientSecure库默认强制校验HTTPS站点证书,未配置的情况下连接会触发内存访问异常
- 构造的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
相关产品推荐
相关产品推荐

