ESP32使用http.addHeader()添加Host请求头返回404问题排查
解决ESP32 HTTPClient添加Host头返回404的问题
我之前调试ESP32网络请求时也碰到过一模一样的情况——Postman里配置IP+Host头能正常拿到结果,放到ESP32的HTTPClient里就返回404。结合你的代码和问题场景,我来拆解下原因和解决办法:
核心原因:请求头不完整
Postman在发送请求时,会自动带上一堆标准HTTP头(比如User-Agent、Connection),但ESP32的HTTPClient默认是极简模式,只会发送最基础的头信息。像ifconfig.me这类服务器会校验请求的完整性,缺少必要的头就会返回404,哪怕你已经加了Host头也没用。
另外,旧版本的ESP32 Arduino Core里,HTTPClient处理IP地址请求时,对自定义Host头的优先级处理有小bug,可能导致你添加的Host头被覆盖或者未正确发送。
修复后的代码示例
你可以补充几个关键的标准头,同时确保头的添加顺序(虽然你试过前后,但配合其他头后顺序的影响会消失):
String new_url = "http://34.117.59.81/ip"; String host = "ifconfig.me"; HTTPClient http; http.begin(new_url.c_str()); // 必须添加的核心头 http.addHeader("Host", host.c_str()); http.addHeader("User-Agent", "ESP32-Client/1.0"); // 模拟标准客户端标识,很多服务器会校验 http.addHeader("Connection", "close"); // 符合HTTP/1.1的连接规范 int httpResponseCode = http.GET(); // 后续处理逻辑 if (httpResponseCode == HTTP_CODE_OK) { String publicIp = http.getString(); Serial.println("获取到的公网IP: " + publicIp); } else { Serial.print("请求失败,响应码: "); Serial.println(httpResponseCode); } http.end();
额外排查建议
- 抓包验证请求头:可以用Wireshark在ESP32所在的网络里抓包,直接查看发送的HTTP请求头,确认Host头是否真的被包含在内;
- 升级Arduino Core版本:如果用的是比较旧的ESP32核心库,建议升级到最新版,很多HTTPClient的头处理bug已经被修复;
- 尝试指定端口:虽然默认80端口可以省略,但你可以试试把URL写成
http://34.117.59.81:80/ip,同时Host头保持ifconfig.me,部分服务器对端口的存在性敏感。
你判断"返回404说明网络连通正常"是完全正确的,问题就出在请求头的完整性上,补充完必要的头之后应该就能正常拿到公网IP了。
内容的提问来源于stack exchange,提问作者Nigel Johnson
相关产品推荐
相关产品推荐

