Golang重写http请求体
我正在服务器端用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 似乎唯一的方法是用适合接口的对象替换主体。为此,
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))
。非常简单。非常感谢@Volkerioutil.nocloser
是我一直在寻找的东西。如果其他人遇到同样的问题:如果您更改正文的长度,您还需要将r.Contentlength更新为新值。例如,newBody:=“新Body”;r、 Body=ioutil.nocloser(strings.NewReader(newBody));r、 ContentLength=int64(len(新手))
r.ContentLength = int64(len(new_body_content))