【问题标题】:Getting EOF error response when doing HEAD request执行 HEAD 请求时获取 EOF 错误响应
【发布时间】:2021-10-12 18:00:11
【问题描述】:

我正在尝试在“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()
}

错误截图:

【问题讨论】:

  • @paulsm4 用代码更新了我的问题。
  • 问:您是否确认可以独立于 Go 获得有效的 HEAD 响应(您是否尝试过 curl、Postman 或类似的工具?他们是否使用 HEADER 信息响应?)问:您是否找到了一个可行的“ Go”代码解决方案(例如http.Head())?请告诉我们!
  • 我确实尝试过使用 Postman,但它没有响应 HEADER 信息。我试过 Curl,它说“服务器的回复是空的”。
  • ``` resp, err := http.Head("speed.hetzner.de/100MB.bin") if err != nil { return err } ``` 按照你的建议尝试了上面的代码。它抛出相同的“ EOF”错误。
  • 酷 - 谢谢。所以听起来你最初的猜测是正确的:1)你的代码没问题:你没有“做错任何事”(比如试图阅读不存在的“身体”)。 2) 相反,该特定 URL (speed.hetzner.de) 正在阻止(或至少拒绝处理)HEAD 请求。

标签: rest go eof http-error


【解决方案1】:

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

...但听起来您正在尝试从 HEAD 请求中读取 HTTP“响应”(而不是仅访问 HTTP 响应标头)。

根据 RFC:

https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4

HEAD 方法与 GET 相同,只是服务器不能 在响应中返回消息体。包含的元信息 在响应 HEAD 请求的 HTTP 标头中应该相同 响应 GET 请求而发送的信息。这种方法可以 用于获取有关实体隐含的元信息 请求而不传输实体主体本身。这种方法是 通常用于测试超文本链接的有效性、可访问性、 以及最近的修改。

换句话说,对 HEAD 请求的响应没有正文。如果你尝试阅读一个,你会得到一个EOF。我怀疑这就是这里发生的事情。


感谢您使用此代码更新您的问题。看起来你正在使用 Go。

试试this

res, err := http.Head("https://golang.org")
if err != nil {
    panic(err)
}
println(res.StatusCode)

请记住:res 将没有 Body


附录

– 拉杰什·塞西

我确实尝试过使用 Postman,但它没有响应 HEADER 信息。 我尝试了 Curl,它显示“来自服务器的空回复”。

上面的代码resp, err := http.Head("speed.hetzner.de/100MB.bin") 会抛出同样的“EOF”错误。

--paulsm4

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

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

  2. 确切地说,那个特定的 URL (speed.hetzner.de) 正在阻止(或至少拒绝处理)HEAD 请求。

【讨论】:

  • 用代码@paulsm4 更新了我的问题
  • 在 HTTPClient().Do(r) 失败并返回错误
  • Sooooo .... 您正在尝试从 Go 发出 HEAD 请求。建议: 1) 使用 不同的 方法尝试“HEAD”,例如curlPostman。验证“它有效”。 2)接下来试试这个例子,使用http.Head()):stackoverflow.com/a/38563299/421195,3)如果指定方法,一定要使用Go const HEAD
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2022-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
相关资源
最近更新 更多