在给定的 Go 代码中,设置了一个反向代理以将请求重定向到 www.google.com。当反向代理正常运行时,问题出现了:如何访问代理请求的响应正文?
解决这个问题的方法在于 httputil 包,它提供了 ReverseProxy 类型。在最新版本的软件包中,ReverseProxy 提供了一个可选的 ModifyResponse 函数,可以自定义和检查来自后端的响应。
具体来说,通过实现此函数,开发人员可以在传递之前修改 *http.Response它给客户。 ModifyResponse 的一个潜在用例是读取和操作响应正文。
为了演示这一点,请考虑以下修改后的代码:
package main import ( "bytes" "fmt" "io/ioutil" "net/http" "net/http/httputil" "net/url" ) func main() { target := &url.URL{Scheme: "http", Host: "www.google.com"} proxy := httputil.NewSingleHostReverseProxy(target) proxy.ModifyResponse = func(resp *http.Response) (err error) { b, err := ioutil.ReadAll(resp.Body) // Read the HTML response body if err != nil { return err } resp.Body.Close() // The body is closed by the ReadAll function, but it's good practice to close it again b = bytes.Replace(b, []byte("server"), []byte("schmerver"), -1) // Modify the HTML response by replacing "server" with "schmerver" newBody := ioutil.NopCloser(bytes.NewReader(b)) resp.Body = newBody resp.ContentLength = int64(len(b)) resp.Header.Set("Content-Length", strconv.Itoa(len(b))) fmt.Println(resp) // Print the modified response for debugging purposes return nil } http.Handle("/google", proxy) http.ListenAndServe(":8099", nil) }
在此代码中,ModifyResponse 函数定义为读取HTML 响应正文,通过替换特定字符串对其进行修改,然后将修改后的正文设置为响应正文。通过处理“/google”URL 路径,对 www.google.com 的请求将被代理,修改后的响应将被发送回客户端。
以上是如何在 Go 中检查和修改反向代理的响应正文?的详细内容。更多信息请关注PHP中文网其他相关文章!