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
字段(以及 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.
我正在设置的 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
字段(以及 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 允许一个 IP 地址为多个域提供服务(在过去它不这样做,但因为我们 运行 IP 不足解决这个变得至关重要)。服务器使用 Host
字段来决定将流量定向到哪个域。您要连接的服务器可能正在接受连接,但没有正确设置 Host
字段,请求没有到达正确的服务器并且失败并显示 404.