栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Golang阅读请求正文

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Golang阅读请求正文

检查和嘲笑请求正文

初次阅读主体时,必须对其进行存储,以便在处理完该主体之后,可以将新

io.ReadCloser
的主体设置为根据原始数据构造的请求主体。因此,当您在链中前进时,下一个处理程序可以读取同一正文。

一种选择是使用读取整个正文

ioutil.ReadAll()
,这会将您作为正文作为字节片。

您可以用来从字节片中

bytes.NewBuffer()
获取一个
io.Reader
。

最后缺少的是使

io.Reader
an
io.ReadCloser
,因为
bytes.Buffer
没有
Close()
方法。为此,您可以使用
ioutil.NopCloser()
包裹
io.Reader
,然后返回
io.ReadCloser
,其添加的
Close()
方法将是no-
op(不执行任何操作)。

请注意,您甚至可以修改用于创建“新”正文的字节片的内容。您完全可以控制它。

但是,必须小心,因为如果仅修改数据,可能还有其他HTTP字段,例如content-
length和checksum,它们可能变得无效。如果后续处理程序检查了这些内容,那么您也需要对其进行修改!

检查/修改响应主体

如果您还想读取响应主体,则必须包装

http.ResponseWriter
您获得的包装,并将包装器传递给链。该包装器可能会缓存发送出的数据,您可以在运行中即时检查(随后的处理程序将其写入)。

这是一个简单的

ResponseWriter
包装程序,它仅缓存数据,因此在后续处理程序返回后将可用:

type MyResponseWriter struct {    http.ResponseWriter    buf *bytes.Buffer}func (mrw *MyResponseWriter) Write(p []byte) (int, error) {    return mrw.buf.Write(p)}

请注意,

MyResponseWriter.Write()
只是将数据写入缓冲区。您也可以选择动态检查(在
Write()
方法中)并将其立即写入包装/嵌入的数据中
ResponseWriter
。您甚至可以修改数据。您拥有完全的控制权。

但是,必须再次小心,因为后续处理程序可能还会发送与响应数据相关的HTTP响应标头(例如长度或校验和),如果您更改响应数据,它们也可能变得无效。

完整的例子

将各个部分放在一起,这是一个完整的工作示例:

func loginmw(handler http.Handler) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        body, err := ioutil.ReadAll(r.Body)        if err != nil { log.Printf("Error reading body: %v", err) http.Error(w, "can't read body", http.StatusBadRequest) return        }        // Work / inspect body. You may even modify it!        // And now set a new body, which will simulate the same data we read:        r.Body = ioutil.NopCloser(bytes.NewBuffer(body))        // Create a response wrapper:        mrw := &MyResponseWriter{ ResponseWriter: w, buf: &bytes.Buffer{},        }        // Call next handler, passing the response wrapper:        handler.ServeHTTP(mrw, r)        // Now inspect response, and finally send it out:        // (You can also modify it before sending it out!)        if _, err := io.Copy(w, mrw.buf); err != nil { log.Printf("Failed to send out response: %v", err)        }    })}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/376349.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号