首页 > 解决方案 > 执行 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()
}

错误截图: 在此处输入图像描述

标签: restgoeofhttp-error

解决方案


您还没有向我们展示任何代码...

...但听起来您正在尝试从 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

酷 - 谢谢。所以听起来你原来的猜测是正确的:

  1. 您的代码没问题:您没有“做错任何事”(例如尝试读取不存在的“正文”)。

  2. 相反,该特定 URL (speed.hetzner.de) 正在阻止(或至少拒绝处理)HEAD 请求。


推荐阅读