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

标签 go

<分区>

我想在解析之前将 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)
}

引用资料:

关于go - 将 HTTP 响应正文写入文件后出现 EOF 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51976800/

相关文章:

go - 在 Gin 框架中,无效字符 'P' 正在寻找值的开头

go - Golang 中的解析时间

json - 如何在解码 JSON 时检查提供的 api 字段的类型

logging - 全局日志记录的正确方法

inheritance - Go - 如何明确声明一个结构正在实现一个接口(interface)?

go - 使用 BoltDB 开始使用 Bleve

json - 在 Go JSON 中转义 unicode 字符,以便输出与 Python 匹配

go - 如何用 Go 实现 BitSet?

Gonum 通过 slice 绘制循环

go - 默认结构值