ESP32 如何使用 http.addHeader() 添加主机标头
Posted
技术标签:
【中文标题】ESP32 如何使用 http.addHeader() 添加主机标头【英文标题】:ESP32 how do I add a Host header with http.addHeader() 【发布时间】:2021-10-13 05:36:30 【问题描述】:我正在调试我正在设置的 WiFi 接入点上的一些 DNS 问题。我正在将 ESP32 连接到我的网络,以便它可以输出它在做什么。我想获取我的公共 IP 地址作为测试,我想使用 http://ifconfig.me/ip
去获取它。这在 DNS 工作时非常棒,但根据标准 HTTPS 内容,我可以在对 IP 地址的调用中使用 Host: name
标头来测试连接性,以确定它是否只是我看到的 DNS 故障。如果我在 Postman 中设置以下,一切都超级棒……
当我在 ESP32 上执行以下操作(应该模仿上述操作)时,我得到一个 404 - 当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());
int httpResponseCode = http.GET();
...
我做错了什么?我已经尝试在begin()
的任一侧调用addHeader()
我尝试了collectHeaders()
调用,但这只保留了响应标头,所以我看不到我实际发送的内容。
从积极的方面来说,我收到 404 确实意味着连接良好,问题是我的 DNS 符合预期,但为什么我(据称)不能发送 Host
标头?
【问题讨论】:
【参考方案1】:HTTPClient
库会自动为您添加 Host
标头。
库是written to silently ignore attempts 添加您自己的Host
字段(以及Connection
、UserAgent
和Authorization
):
// not allow set of Header handled by code
if(!name.equalsIgnoreCase(F("Connection")) &&
!name.equalsIgnoreCase(F("User-Agent")) &&
!name.equalsIgnoreCase(F("Host")) &&
!(name.equalsIgnoreCase(F("Authorization")) && _base64Authorization.length()))
String headerLine = name;
不幸的是,它目前没有提供一种方法来告诉它使用特定的Host
和一个无法解析的 IP 地址。
您可以将库复制到您的项目中,然后删除阻止它使用您的 Host
字段的检查。或者(我不喜欢这样建议,因为我通常会推动人们使用 HTTPClient
库而不是使用他们自己的库)您可以使用 WiFiClient
进行自己的简单 HTTP 实现。
听起来您已经明白这一点,但对于可能阅读此内容的其他人来说,HTTP 允许一个 IP 地址为多个域提供服务(在过去它没有,但由于我们的 IP 地址不足,这变得至关重要)。服务器使用Host
字段来决定将流量定向到哪个域。您正在连接的服务器可能正在接受连接,但没有正确设置 Host
字段,请求没有发送到正确的服务器并且失败并出现 404。
【讨论】:
这是一个相当笨拙的实现,但是一个非常彻底的答案。谢谢。 是的,我不知道它自己默默地丢弃了一些标题,直到我检查了代码......不是很好。 :(以上是关于ESP32 如何使用 http.addHeader() 添加主机标头的主要内容,如果未能解决你的问题,请参考以下文章