Golang阅读请求正文

Golang阅读请求正文,第1张

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)        }    })}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4921701.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存