rest - 执行 HEAD 请求时获取 EOF 错误响应
问题描述
我正在尝试在“https://speed.hetzner.de/100MB.bin”上发出 HEAD 请求以获取文件的元数据。我收到了 EOF 错误响应。但是,对于相同的 URL,GET 请求是成功的。
可能的原因是什么?
我怀疑服务器已经阻止了 HEAD 请求,但是我该如何验证呢?
PS:添加代码:
func BuildRequest(method string, url string) (*http.Request, error) {
r, err := http.NewRequest(method, url, nil)
r.Header.Set("User-Agent", "my app")
return r, err
}
func (m *FileMeta) Fetch(url string) error {
r, err := BuildRequest(http.MethodHead, url)
if err != nil {
return err
}
resp, err := HTTPClient().Do(r)
if err != nil {
return err
}
defer resp.Body.Close()
}
解决方案
您还没有向我们展示任何代码...
...但听起来您正在尝试从 HEAD 请求中读取 HTTP“响应”(而不是仅访问 HTTP 响应标头)。
根据 RFC:
https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4
HEAD 方法与 GET 相同,只是服务器不能在响应中返回消息体。响应 HEAD 请求的 HTTP 标头中包含的元信息应该与响应 GET 请求发送的信息相同。此方法可用于获取有关请求所隐含的实体的元信息,而无需传输实体主体本身。这种方法通常用于测试超文本链接的有效性、可访问性和最近的修改。
换句话说,对 HEAD 请求的响应没有正文。如果你尝试阅读一个,你会得到一个EOF。我怀疑这就是这里发生的事情。
感谢您使用此代码更新您的问题。看起来你正在使用 Go。
试试这个:
res, err := http.Head("https://golang.org")
if err != nil {
panic(err)
}
println(res.StatusCode)
请记住:res 将没有 Body。
附录
——拉杰什·塞西
我确实尝试过使用 Postman,但它没有响应 HEADER 信息。我试过卷曲,它说“服务器的空回复”。
上面的代码
resp, err := http.Head("speed.hetzner.de/100MB.bin")
,,抛出相同的“EOF”错误。
– paulsm4
酷 - 谢谢。所以听起来你原来的猜测是正确的:
您的代码没问题:您没有“做错任何事”(例如尝试读取不存在的“正文”)。
相反,该特定 URL (speed.hetzner.de) 正在阻止(或至少拒绝处理)HEAD 请求。
推荐阅读
- angular - 如何以静默方式将浏览器重定向到重定向 Uri 以避免身份验证弹出 (AAD)
- rpa - UiPath Chrome 浏览器连接问题
- android - 模块是使用不兼容的 Kotlin 版本编译的。**其元数据的二进制版本为 1.5.1,预期版本为 1.1.15**
- google-apps-script - Google Data Studio 社区连接器:在应用脚本中访问 URL 参数
- java - 为什么不读取 JSON 文件?
- express - express、socket io、会话共享
- linux - 如何使用devilspie2在一个工作区打开一个窗口然后停止它?
- python - 在分组数据框的两列上移动滚动移动平均值
- python - Micropython 电报机器人仅轮询聊天记录中的第一条消息
- numpy - 具有自定义过滤的数组的 numpy 数组