登录
首页 >  Golang >  Go问答

将 HTTP 响应正文写入文件后出现 EOF 错误

来源:stackoverflow

时间:2024-05-02 08:06:37 357浏览 收藏

学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《将 HTTP 响应正文写入文件后出现 EOF 错误》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

问题内容

我想在解析之前将 json 响应保存到文本文件:

req, err := http.NewRequest("POST", url, body)
req.Header.Set("Authorization", "secret_key")
req.Header.Set("Content-Type", "application/json")

resp, err := client.Do(req)
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()

f, err := os.Create("./response.json")
if err != nil {
    log.Fatal(err)
}
defer f.Close()
io.Copy(f, resp.Body)

var result JSONResult
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
    log.Fatal(err)
}

它成功地将 json 写入文件,但随后在解码步骤中失败,并出现错误,仅显示 eof。如果我在写入文件之前解析它解析正常,但文件是空的。有人可以解释一下这里发生了什么吗?谢谢!


解决方案


http.Response.Body 的类型为 io.ReadCloser,只能读取一次(如您所见,它没有倒回的方法)。

因此,为了解码目的,您也可以读取刚刚创建的文件。

或者,如果响应不大(或者您可以使用 io.LimitReader 修剪它) - 您可以将其读入缓冲区

(未经测试,类似的内容):

f, err := os.Create("./response.json")
if err != nil {
    log.Fatal(err)
}
defer f.Close()

var buf bytes.Buffer
tee := io.TeeReader(r.Body, &buf)

io.Copy(f, tee)

var result JSONResult
if err := json.NewDecoder(buf).Decode(&result); err != nil {
    log.Fatal(err)
}

参考文献:

好了,本文到此结束,带大家了解了《将 HTTP 响应正文写入文件后出现 EOF 错误》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>