为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕尼黑的夜晚无繁华 2023-03-21 17:26:33
我想在解析之前将 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 JSONResultif err := json.NewDecoder(resp.Body).Decode(&result); err != nil {    log.Fatal(err)}它成功地将 JSON 写入文件,但随后在解码步骤中失败,并出现一个错误,即EOF. 如果我在写入文件之前解析它解析正常,但文件为空。有人可以解释这里发生了什么吗?谢谢!
查看完整描述

1 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

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)

}


查看完整回答
反对 回复 2023-03-21
  • 1 回答
  • 0 关注
  • 295 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信