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 字段(以及ConnectionUserAgentAuthorization):

    // 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() 添加主机标头的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Lua 中通过 ESP32 和 NodeMCU 使用蓝牙

esp32怎么输出80code

esp32蓝牙频偏

ESP32引脚参考详细说明

esp32 cam如何设置静态的IP

如何使用Arduino ESP32将数据存储到MicroSD(软SPI和硬SPI)