背景
最近在开发一个功能时,需要通过 http 协议上报大量的日志内容,但是在 Go 标准库里的 http client 的 API 是这样的:
1 | http.NewRequest(method, url string, body io.Reader) |
body 是通过io.Reader
接口来传递,并没有暴露一个io.Writer
接口来提供写入的办法,先来看看正常情况下怎么写入一个body
,示例:
1 | buf := bytes.NewBuffer([]byte("hello")) |
需要先把要写入的数据放在Buffer
中,放内存缓存着,但是我需要写入大量
的数据,如果都放内存里肯定要 OOM 了,http client 并没有提供流式写入
的方法,我这么大的数据量直接用Buffer
肯定是不行的,最后在 google 了一番之后找到了解决办法。