ESP8266发送HTTPS请求失败问题咨询及解决方法求助
ESP8266 HTTPS请求失败解决方案
针对你遇到的"向HTTPS端口发送纯HTTP请求"400错误,以及改用WiFiClientSecure仍失败的问题,可按以下步骤排查解决:
1. 明确错误根源
400错误是因为API服务器监听HTTPS端口(默认443),但你使用WiFiClient发送的是HTTP协议请求,服务器拒绝处理。改用WiFiClientSecure是正确方向,但失败通常是证书配置、核心版本或代码初始化问题导致。
2. 正确配置WiFiClientSecure
确保ESP8266核心版本达标
旧版本ESP8266核心对TLS 1.2/1.3支持不完善,建议升级到2.7.4及以上版本(在Arduino IDE的开发板管理器中更新)。
证书处理二选一
方式一:导入服务器根证书(推荐,安全)
- 从API服务器获取根证书:用浏览器访问API地址,查看证书详情,导出PEM格式的根证书。
- 在代码中嵌入证书并加载:
// 替换为你的API服务器根证书内容 const char* rootCACert = R"EOF( -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt 43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg 06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- )EOF"; WiFiClientSecure client; void setup() { // ... WiFi连接代码 ... client.setCACert(rootCACert); // 加载根证书 }
方式二:跳过证书验证(仅测试用,不安全)
如果只是临时测试,可关闭证书验证(生产环境禁止使用):
WiFiClientSecure client; client.setInsecure(); // 跳过证书验证
3. 修正HTTPClient初始化代码
确保API URL为HTTPS开头,正确传入WiFiClientSecure实例:
#include <ESP8266WiFiMulti.h> #include <ESP8266HTTPClient.h> #include <WiFiClientSecure.h> ESP8266WiFiMulti wifiMulti; WiFiClientSecure client; const char* rootCACert = "你的根证书内容"; void setup() { Serial.begin(115200); // 添加WiFi网络 wifiMulti.addAP("WiFi名称", "WiFi密码"); // 等待WiFi连接 while (wifiMulti.run() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWiFi连接成功"); // 加载证书(如果用方式一) client.setCACert(rootCACert); // 如果用方式二,替换为client.setInsecure(); } void loop() { // 采集MAX6675温度数据 float temperature = readMAX6675(); // 替换为你的温度采集函数 HTTPClient http; // 初始化HTTP连接,传入WiFiClientSecure和完整HTTPS URL if (http.begin(client, "https://你的API地址/上传接口")) { // 设置请求头,与ESP32版本一致 http.addHeader("Content-Type", "application/json"); // 构造请求数据,和之前ESP32的格式保持一致 String payload = "{\"temp\":" + String(temperature) + "}"; // 发送POST请求 int httpCode = http.POST(payload); // 处理响应 if (httpCode > 0) { Serial.printf("响应码: %d\n", httpCode); String response = http.getString(); Serial.println("响应内容: " + response); } else { Serial.printf("请求失败,错误码: %d\n", httpCode); Serial.printf("错误描述: %s\n", http.errorToString(httpCode).c_str()); } http.end(); // 关闭连接 } else { Serial.println("初始化HTTP连接失败"); } delay(5000); // 定时上传间隔 } // 示例MAX6675读取函数 float readMAX6675() { // 替换为你的MAX6675采集逻辑 return 25.5; }
4. 排查其他可能问题
- 确认WiFi连接正常:
wifiMulti.run()返回WL_CONNECTED,且能获取到IP地址。 - 检查API URL正确性:必须以
https://开头,若服务器使用非默认443端口,需在URL中指定(如https://api.example.com:8443/upload)。 - 匹配请求格式:确保请求头、payload结构和之前ESP32的代码完全一致,服务器可能因格式不匹配拒绝请求。
- 内存排查:ESP8266内存有限,避免同时运行过多任务,必要时用
free()函数释放内存。
内容的提问来源于stack exchange,提问作者Elias
相关产品推荐
相关产品推荐

