首页  >  文章  >  后端开发  >  如何访问 Go 的反向代理中的响应正文?

如何访问 Go 的反向代理中的响应正文?

Patricia Arquette
Patricia Arquette原创
2024-11-19 16:39:02537浏览

How can I access the response body in Go's reverse proxy?

如何在 Go 的反向代理中访问 Response Body

在 Go 中,httputil/reverseproxy 包提供了一种便捷的方式来实现反向代理服务器。然而,访问底层 HTTP 请求的响应正文可能具有挑战性。

原始代码

给定的 Go 代码演示了一个简单的反向代理服务器:

package main

import (
    "net/http"
    "net/http/httputil"
    "net/url"
)

func main() {
    target := &url.URL{Scheme: "http", Host: "www.google.com"}
    proxy := httputil.NewSingleHostReverseProxy(target)

    http.Handle("/google", proxy)
    http.ListenAndServe(":8099", nil)
}

访问响应体

要访问响应体,您可以使用httputil/reverseproxy包提供的ModifyResponse函数。此函数允许您在将 HTTP 响应发送到客户端之前对其进行修改。

通过实现 ModifyResponse 函数,您可以对响应执行各种操作,包括:

  • 读取并修改响应正文
  • 设置自定义标头
  • 重定向响应

示例

以下是如何操作的示例您可以修改响应正文:

func rewriteBody(resp *http.Response) (err error) {
    b, err := ioutil.ReadAll(resp.Body) // Read html
    if err != nil {
        return  err
    }
    err = resp.Body.Close()
    if err != nil {
        return err
    }
    b = bytes.Replace(b, []byte("server"), []byte("schmerver"), -1) // replace html
    body := ioutil.NopCloser(bytes.NewReader(b))
    resp.Body = body
    resp.ContentLength = int64(len(b))
    resp.Header.Set("Content-Length", strconv.Itoa(len(b)))
    return nil
}

target, _ := url.Parse("http://example.com")
proxy := httputil.NewSingleHostReverseProxy(target)
proxy.ModifyResponse = rewriteBody

通过这种方式实现ModifyResponse函数,您可以在响应正文发送到客户端之前修改和读取响应正文。

以上是如何访问 Go 的反向代理中的响应正文?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn