ESP32 如何使用 http.addHeader() 添加主机 header

ESP32 how do I add a Host header with http.addHeader()

我正在设置的 WiFi 接入点上调试一些 DNS 问题。我正在将 ESP32 连接到我的网络,以便它可以输出它的最新动态。我想获取我的 Public IP 地址作为测试,我想使用 http://ifconfig.me/ip 去获取它。这在 DNS 工作时非常好,但根据标准的 HTTPS 内容,我可以在对 IP 地址的调用中使用 Host: name header 来测试连接性以确定它是否只是 DNS 故障我是看到。如果我在Postman中设置如下,一切都超...

当我在 ESP32 上执行以下操作(应该模仿上述操作)时,我得到一个 404 - 当 Host header 未发送或不正确时会发生这种情况。

...
    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();
...

我做错了什么?我试过 addHeader() 调用 begin()

的任一侧

我试过 collectHeaders() 调用,但这只会保留响应 header,所以我看不到我实际发送的内容。

积极的一面是,我收到 404 确实意味着连接正常,问题出在我的 DNS 上,但为什么我不能(据称)发送 Host header?

HTTPClient 库会自动为您添加 Host header。

图书馆 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.