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

时间:2018-08-23 00:22:56

标签: 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的错误。如果我在写入文件之前进行了解析,就可以解析,但是文件为空。有人可以解释一下这里发生了什么吗?谢谢!

1 个答案:

答案 0 :(得分:2)

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)
}

参考文献: