【问题标题】:How to read multiple times from a bytes.Buffer?如何从 bytes.Buffer 中多次读取?
【发布时间】:2016-02-11 22:20:05
【问题描述】:

我正在尝试创建两个具有相同请求正文的 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 中“重放”任何阅读器?一个 bytes.Buffer 或任何其他 Reader。

【问题讨论】:

    标签: http go byte


    【解决方案1】:

    好的。所以我不认为这是理想的,最好首先初始化一个阅读器,但如果你把你的数据放在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 确实如此。
    • @KevinBurke 用至少有效的东西编辑了这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2017-02-09
    • 2013-06-20
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多