如何从bytes.Buffer多次读取?

时间:2016-02-11 22:20:06

标签: http go byte

我尝试使用相同的请求主体创建两个HTTP请求。不幸的是,第二个请求发送了一个空体。

w := httptest.NewRecorder()
w2 := httptest.NewRecorder()
pd := &postData{
    Data: 5,
}
b := new(bytes.Buffer)
json.NewEncoder(b).Encode(pd)
req, _ := http.NewRequest("PUT", "/v1/jobs/echo", b)
server.ServeHTTP(w, req)

req, _ = http.NewRequest("PUT", "/v1/jobs/echo", b)
server.ServeHTTP(w2, req)

阅读文档和bytes.Buffer的源代码,看起来没有办法将缓冲区重置为0 - 那里有一个重置方法,但这也擦除了缓冲区'内部状态。

有没有办法重播" Go的任何读者?一个bytes.Buffer或任何其他Reader。

1 个答案:

答案 0 :(得分:3)

行。所以我不会考虑这个理想,最好只是首先启动一个读者,但如果你把数据放在bytes.Reader而不是bytes.Buffer,那么你就可以了在第一次打电话给NewRequest之后,能够回到起点。

w := httptest.NewRecorder()
w2 := httptest.NewRecorder()
pd := &postData{
    Data: 5,
}
b := new(bytes.Buffer)
json.NewEncoder(b).Encode(pd)
r := bytes.NewReader(b.Bytes())
req, _ := http.NewRequest("PUT", "/v1/jobs/echo", r)
server.ServeHTTP(w, req)

r.Seek(0, 0)
req, _ = http.NewRequest("PUT", "/v1/jobs/echo", r)
server.ServeHTTP(w2, req)