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

我想在解析之前将 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. 如果我在写入文件之前解析它解析正常,但文件为空。有人可以解释这里发生了什么吗?谢谢!


慕尼黑的夜晚无繁华
浏览 296回答 1
1回答

波斯汪

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.Buffertee := io.TeeReader(r.Body, &buf)io.Copy(f, tee)var result JSONResultif err := json.NewDecoder(buf).Decode(&result); err != nil {    log.Fatal(err)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go