Qia*_*hen 6 http request go interceptor
我正在服务器端的Golang中编写一个http拦截器.我可以从中读取http请求正文r.Body.现在,如果我想修改正文内容,如何在控件传递给下一个拦截器之前修改请求体?
func(w http.ResponseWriter, r *http.Request) {
    // Now I want to modify the request body, and 
    // handle(w, r)
}
I15*_*159 10
Body io.ReadCloser似乎唯一的方法是Body用适合于io.ReadCloser接口的对象替换a .为此,你需要构建一个Body使用它返回任何函数对象io.Reader对象,并ioutil.NopCloser在转io.Reader对象io.ReadCloser.
bytes.NewBufferString
NewBufferString使用字符串s作为其初始内容创建并初始化一个新的Buffer.它旨在准备一个缓冲区来读取现有的字符串.
strings.NewReader (在下面的例子中使用)
NewReader从s返回一个新的Reader读数.它类似于bytes.NewBufferString但更高效且只读.
ioutil.NopCloser
NopCloser返回一个ReadCloser,其中包含一个无操作的Close方法,用于包装提供的Reader r.
new_body_content := "New content."
r.Body = ioutil.NopCloser(strings.NewReader(new_body_content))
但要明确并且不要混淆应用程序的其他部分,您需要更改Request与Body内容相关的属性.大部分时间它只是ContentLength:
r.ContentLength = int64(len(new_body_content))
在极少数情况下,当您的新内容使用与原始编码不同的编码时Body,它可能是TransferEncoding.