Golang Go语言中如何拦截并修改response的内容啊
如下所示,简单做个代理
func main() {
remote, _ := url.Parse("http://www.xxxx.com")
proxy := httputil.NewSingleHostReverseProxy(remote)
log.Fatal( http.ListenAndServe(":9999", proxy))
}
我想把代理后返回的一些内容替换掉.但是怎么都成功不了. 下面这样怎么没反映? go 的 http 太"精髓"了.才学几天,摸不着门道. 哪位同学能指个路吗?谢谢.
func (t *transport) RoundTrip(req *http.Request) (res *http.Response, err error) { res, err = t.RoundTripper.RoundTrip(req)
b, err := ioutil.ReadAll(res.Body) if err != nil { return nil, err } defer res.Body.Close() b = bytes.Replace(b, []byte("Keywords"), []byte("xxxxxxxx"), -1) body := ioutil.NopCloser(bytes.NewReader(b)) res.Body = body res.ContentLength = int64(len(b)) res.Header.Set("Content-Length", strconv.Itoa(len(b))) return res, nil
}
Golang Go语言中如何拦截并修改response的内容啊
4 回复
更多关于Golang Go语言中如何拦截并修改response的内容啊的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
…低级错误,后来发现确实是这原因.
谢谢
在Golang(Go语言)中,拦截并修改HTTP响应(response)的内容通常涉及到中间件(middleware)的使用,特别是在使用像Gin这样的Web框架时。以下是一个基本的步骤指南:
-
创建中间件: 中间件是一个函数,它接收一个
http.Handler
作为参数,并返回一个新的http.Handler
。在这个新的处理器中,你可以拦截请求和响应。 -
修改响应: 在中间件中,你可以使用
http.ResponseWriter
的包装器来捕获和修改响应内容。例如,你可以创建一个自定义的ResponseWriter
,它实现了http.ResponseWriter
接口,并在写入响应时进行修改。 -
注册中间件: 在Gin框架中,你可以使用
Use
方法来注册中间件,这样每个经过的HTTP请求都会经过这个中间件。
示例代码(使用Gin):
package main
import (
"bytes"
"github.com/gin-gonic/gin"
"net/http"
)
func modifyResponseMiddleware(c *gin.Context) {
var buf bytes.Buffer
rw := &responseWriter{ResponseWriter: c.Writer, body: &buf}
c.Writer = rw
c.Next()
// 修改响应体
rw.body.WriteString(" - Modified")
// 将修改后的响应体写回
c.Writer.Header().Set("Content-Length", strconv.Itoa(rw.body.Len()))
rw.ResponseWriter.Write(rw.body.Bytes())
}
// 自定义ResponseWriter实现...
func main() {
r := gin.Default()
r.Use(modifyResponseMiddleware)
r.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Hello, World!")
})
r.Run()
}
注意:上述代码示例省略了部分实现细节,如responseWriter
结构体的定义,需自行补充。