gpt4 book ai didi

go - 如何在中间件中获取请求体

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

我需要在中间件中获取请求正文。像这样的东西:

return func(w http.ResponseWriter, req *http.Request) {

data, err := handler(w, req)

if err != nil {
buf := new(bytes.Buffer)
buf.ReadFrom(req.Body)
s := buf.String()

但是我得到了带有正文的 POST 请求的 s == "" 。为什么以及如何修复它?

最佳答案

您只能阅读一次请求正文,但您可以阅读一次并创建所阅读内容的副本。使用 tee 阅读器

https://golang.org/pkg/io/#example_TeeReader

或者这个答案:

https://stackoverflow.com/a/23077519/6376471

两者都包括将正文读入内存一次,然后进行复制。因此,当您在中间件中使用它时,您会将副本重新分配给请求对象,然后再将其转发给处理程序。

给你这样的东西:

return func (w http.ResponseWriter, req *http.Request) {
buf, err := ioutil.ReadAll(r.Body) // handle the error
rdr1 := ioutil.NopCloser(bytes.NewBuffer(buf))

req.Body = rdr1
data, err := handler(w, req)
if err != nil {
s := buf.String()
// ... trimmed
}
}

这显然将请求主体的所有副作用都存入内存,如果请求主体非常大等等。您的中间件正在从处理程序等中夺走一些控制权。

关于go - 如何在中间件中获取请求体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51327647/

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