我正在服务器端的Golang中编写一个http拦截器。我可以从r.Body
读取http请求正文。现在如果我想修改正文内容,如何在控件传递给下一个拦截器之前修改请求体?
func(w http.ResponseWriter, r *http.Request) {
// Now I want to modify the request body, and
// handle(w, r)
}
答案 0 :(得分:8)
Body io.ReadCloser
似乎唯一的方法是将Body
替换为适合io.ReadCloser
接口的对象。为此,您需要使用任何返回Body
对象和ioutil.NopCloser
的函数来构造io.Reader
对象,以将io.Reader
对象转换为io.ReadCloser
。
bytes.NewBufferString
NewBufferString使用字符串s作为其初始内容创建并初始化一个新的Buffer。它旨在准备一个缓冲区来读取现有的字符串。
strings.NewReader
(在下面的示例中使用)
NewReader从s返回一个新的Reader读数。它类似于bytes.NewBufferString,但效率更高,只读。
ioutil.NopCloser
NopCloser返回一个ReadCloser,其中包含一个no-op 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
。