Golang重写http请求体

Golang重写http请求体,http,go,request,interceptor,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) } Body io.ReadCloser 似乎唯一的方法是用适合接口的对象替换主体。为此,

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

func(w http.ResponseWriter, r *http.Request) {
    // Now I want to modify the request body, and 
    // handle(w, r)
}
Body io.ReadCloser
似乎唯一的方法是用适合接口的对象替换
主体
。为此,您需要使用返回
io.Reader
对象的任何函数构造
Body
对象,并将
io.Reader
对象转换为
io.ReadCloser

bytes.NewBufferString

NewBufferString使用字符串s作为其初始内容创建并初始化新缓冲区。它旨在准备一个缓冲区来读取现有字符串

strings.NewReader
(在下面的示例中使用)

NewReader返回从s读取的新读取器。它类似于bytes.NewBufferString,但效率更高且为只读

ioutil.nocloser

nocloser返回一个ReadCloser,其中包含一个no-op-Close方法,该方法包装提供的读取器r

相关属性 但是为了清楚并且不混淆应用程序的其他部分,您需要更改与
正文
内容相关的
请求
属性。大多数情况下,它只是
ContentLength

r.ContentLength = int64(len(new_body_content))

在极少数情况下,当您的新内容使用与原始
正文不同的编码时,可能是
transferncode

您能否详细说明什么类型的拦截器进入控制,以及谁将控制权传递给这些拦截器。什么是“客户”?您读取正文的代码至少是“一个”客户机。我添加了一些示例代码。基本上,我想修改响应并将其传递给下一个处理器。在http服务器发送回响应之前,我在服务器端也遇到了同样的问题。您阅读了整个正文,进行了修改,并将其填充回您的请求中。类似于(伪代码)
b=ioutil.ReadAll(r.Body);b[42]=99;r、 Body=ioutil.nocloser(bytes.NewBuffer(b))
。非常简单。非常感谢@Volker
ioutil.nocloser
是我一直在寻找的东西。如果其他人遇到同样的问题:如果您更改正文的长度,您还需要将r.Contentlength更新为新值。例如,
newBody:=“新Body”;r、 Body=ioutil.nocloser(strings.NewReader(newBody));r、 ContentLength=int64(len(新手))
r.ContentLength = int64(len(new_body_content))