如何从bytes.Buffer中多次读取数据?

5

我正在尝试创建两个具有相同请求正文的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 - 有一个Reset方法,但这也会清除缓冲区的内部状态。

在Go中是否有一种“重播”任何Reader的方法?包括bytes.Buffer或其他Reader。

1个回答

8

好的。虽然这不是最理想的做法,最好还是一开始就初始化一个读取器,但如果您将数据放入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)

也许我漏掉了什么,但我不认为 bytes.Buffer 有 Seek() 方法。不过 bytes.Reader 有。 - Kevin Burke
@KevinBurke 至少编辑了一些可用的内容。 - evanmcdonnal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接