gpt4 book ai didi

http - 如何倒带 io.ReadCloser

转载 作者:数据小太阳 更新时间:2023-10-29 03:38:12 26 4
gpt4 key购买 nike

我总是被 io.ReadCloser 困住,然后忘记我以前读过它,当我再次阅读它时,我得到一个空的负载。我希望对我的愚蠢进行一些 lint 检查。尽管如此,我认为我可以使用 TeeReader,但它在这里没有达到我的期望:

func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
buf := &bytes.Buffer{}
tee := io.TeeReader(r.Body, buf)
body, err := ioutil.ReadAll(tee)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
log.Println("body", string(body))
payload, err := httputil.DumpRequest(r, true)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
log.Println("dump request", string(payload))
w.WriteHeader(http.StatusOK)
})
log.Fatal(http.ListenAndServe(":8080", nil))
}

正文从我的“转储请求”日志行中丢失。

即当我运行 curl -i -X POST --data '{"username":"xyz","password":"xyz"}' http://localhost:8080

我想要完整的原始请求:

2019/01/14 11:09:50 dump request POST / HTTP/1.1
Host: localhost:8080
Accept: */*
Content-Length: 35
Content-Type: application/x-www-form-urlencoded
User-Agent: curl/7.63.0

{"username":"xyz","password":"xyz"}

我错过了什么?

最佳答案

你不能回退 io.ReadCloser,除非基础值也是 io.ReadSeeker .

根据定义,io.ReadCloser 恰好有两个方法:ReadClose。所以显然没有倒带的选项。

相比之下,io.ReadSeeker 有两种方法:ReadSeek,后者允许倒带。

如果您只需要接受同样可搜索的 io.ReadCloser,您可以轻松地将这两者结合起来:

type ReadSeekCloser interface {
io.Reader
io.Seeker
io.Closer
}

现在您可以使用自定义 ReadSeekCloser 类型代替 io.ReadCloser,并且您可以选择倒回阅读器。

当然,很少有 io.ReadCloser 实际符合这个接口(interface)(os.File 将是主要的)。如果您有一个未实现 Seek 方法的 io.ReadCloser(例如网络流),可能是实现它的最简单方法 Seekable 是将内容转储到文件中,然后打开该文件。还有其他方法可以使内存缓冲区可搜索(例如 bytes.NewReader),但变体将需要首先将流读入内存或磁盘。

关于http - 如何倒带 io.ReadCloser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54175360/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com