Golang重写了http请求体

时间:2015-11-09 09:46:59

标签: http go request interceptor

我正在服务器端的Golang中编写一个http拦截器。我可以从r.Body读取http请求正文。现在如果我想修改正文内容,如何在控件传递给下一个拦截器之前修改请求体?

func(w http.ResponseWriter, r *http.Request) {
    // Now I want to modify the request body, and 
    // handle(w, r)
}

1 个答案:

答案 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