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 回复

我猜是因为 res 的内容被压缩了,所以没被替换。
不显式的在 req 里声明压缩响应,是能成功的。
加一句这个试试 req.Header.Del(“Accept-Encoding”)


…低级错误,后来发现确实是这原因.
谢谢

在Golang(Go语言)中,拦截并修改HTTP响应(response)的内容通常涉及到中间件(middleware)的使用,特别是在使用像Gin这样的Web框架时。以下是一个基本的步骤指南:

  1. 创建中间件: 中间件是一个函数,它接收一个http.Handler作为参数,并返回一个新的http.Handler。在这个新的处理器中,你可以拦截请求和响应。

  2. 修改响应: 在中间件中,你可以使用http.ResponseWriter的包装器来捕获和修改响应内容。例如,你可以创建一个自定义的ResponseWriter,它实现了http.ResponseWriter接口,并在写入响应时进行修改。

  3. 注册中间件: 在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结构体的定义,需自行补充。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!