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