ESP8266(Arduino)中http.GET()返回-1问题求助
问题
尝试从API端点https://bitcoin-ethereum-price-test.vercel.app/btc获取数据,每次调用http.GET()都返回-1,但浏览器访问该端点能正常返回200状态码。
使用的代码如下:
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <WiFiClient.h> #include <Wire.h> WiFiClient wifiClient; void setup() { Serial.begin(9600); WiFi.begin("56", "emayush56"); while(WiFi.status() != WL_CONNECTED) { delay(200); Serial.print(".."); } Serial.println(); Serial.println("NodeMCU is connected!"); Serial.println(WiFi.localIP()); } void loop() { if (WiFi.status() == WL_CONNECTED) { HTTPClient http; http.begin(wifiClient, "https://bitcoin-ethereum-price-test.vercel.app/btc"); int httpCode = http.GET(); Serial.println("*** RESPONSE STATUS ***"); Serial.println(httpCode); if (httpCode > 0) { String payload = http.getString(); Serial.println(payload); } http.end(); } delay(3000); }
已尝试http.begin()的两种调用形式,但问题依旧:
- type1:
bool begin(WiFiClient &client, const String& url); - type2:
bool begin(WiFiClient &client, const String& host, uint16_t port, const String& uri = "/", bool https = false);
问题分析与解决方法
核心原因:普通WiFiClient不支持HTTPS
你使用的WiFiClient仅能处理HTTP请求,无法解析HTTPS所需的SSL/TLS加密连接,这是导致GET()返回-1(连接失败)的主要原因。浏览器内置了SSL处理能力,所以能正常访问HTTPS端点,但ESP8266的默认WiFiClient不具备该功能。
修复步骤
替换为WiFiClientSecure
将代码中的WiFiClient替换为WiFiClientSecure,并包含对应的头文件:#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <WiFiClientSecure.h> // 替换原WiFiClient头文件 #include <Wire.h> WiFiClientSecure wifiClient; // 替换为WiFiClientSecure跳过SSL证书验证(测试阶段)
为了快速验证,可以临时跳过证书验证(生产环境建议配置正确证书):
在setup()函数中添加:wifiClient.setInsecure(); // 跳过证书验证,仅用于测试调整http.begin调用(可选)
使用type2调用形式时,需指定HTTPS端口443,并开启https参数:http.begin(wifiClient, "bitcoin-ethereum-price-test.vercel.app", 443, "/btc", true);完整修复后代码示例
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <WiFiClientSecure.h> #include <Wire.h> WiFiClientSecure wifiClient; void setup() { Serial.begin(9600); WiFi.begin("56", "emayush56"); while(WiFi.status() != WL_CONNECTED) { delay(200); Serial.print(".."); } Serial.println(); Serial.println("NodeMCU is connected!"); Serial.println(WiFi.localIP()); wifiClient.setInsecure(); // 测试用,跳过证书验证 } void loop() { if (WiFi.status() == WL_CONNECTED) { HTTPClient http; // 两种调用方式任选其一 // 方式1:直接传入完整URL http.begin(wifiClient, "https://bitcoin-ethereum-price-test.vercel.app/btc"); // 方式2:拆分host、port、uri // http.begin(wifiClient, "bitcoin-ethereum-price-test.vercel.app", 443, "/btc", true); int httpCode = http.GET(); Serial.println("*** RESPONSE STATUS ***"); Serial.println(httpCode); if (httpCode > 0) { String payload = http.getString(); Serial.println(payload); } http.end(); } delay(3000); }
其他可能排查点
- 检查WiFi网络是否有防火墙或代理限制,阻止ESP8266访问外部HTTPS服务
- 确认API端点没有针对非浏览器请求的反爬策略(比如UA检测),可以尝试添加自定义User-Agent:
http.addHeader("User-Agent", "ESP8266-HTTPClient/1.0");
内容的提问来源于stack exchange,提问作者emAyush56
相关产品推荐
相关产品推荐

