当前位置: 首页 > 面试题库 >

Golang:如何读取ReverseProxy的响应主体?

东门深
2023-03-14
问题内容
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有一个Transport领域。您可以使用它来修改响应。例如:

type transport struct {
    http.RoundTripper
}

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

// ...
proxy := httputil.NewSingleHostReverseProxy(target)
proxy.Transport = &transport{http.DefaultTransport}

整个场景的操场示例:http :
//play.golang.org/p/b0S5CbCMrI。



 类似资料:
  • 反向代理是可行的。我怎样才能得到响应体?

  • 我正在编写一些中间件,我需要能够记录响应主体内容,即使目标使用TLS加密。 我有一个处理程序链,在其中我将响应体存储在中间缓冲区中,这样我就可以多次读取它。这是基于icza(Golang读取请求体)提供的优秀示例。 在我的handler func中,我正在这样做。。。。 我发现,当连接到不使用TLS的目的地时,我得到了可读的输出,但是当连接到使用TLS的目的地时,响应主体似乎仍然是加密的,尽管复制

  • Axios 0.17.1 响应的console.log为 {data:“{”error“:”name必须输入多个…null [“ispipe”:protected]=>null}}“,状态:203,statustext:”非权威信息“,标题:{…},配置:{…},…}配置:{adapter:f,转换请求:{…},转换响应:{…},超时:0,xsrfcookiename:”xsrf-token“,…

  • 我创建了一个反向代理,如下所示: 并从main调用它: 它在客户端可以正常工作,但是我想阅读代理的响应,我怎么做?

  • 问题内容: 我在Go中编写自己的ReverseProxy。ReverseProxy应该连接我的go-webserver和apache2 webserver。但是,当我在另一个IP地址上运行反向代理时,然后在我的Apache2 Web服务器上,当反向代理将请求发送到apache时,我的apache-logfile中出现以下错误。 我的反向代理和apache-webserver在https上运行。 这

  • 问题内容: 我在andorid中制作了一些代理服务器来修改http标头,它可以正常工作,但是我必须将完整的响应转发到“顶层”。 如何从HttpURLConnection读取整个响应(所有标头,内容,所有内容)? 在getInputStream中,我仅收到内容,是否有可能包含某些内容? 问题答案: 无法直接使用来转储完整的HTTP响应,但是您可以使用其各种方法来重构它。例如, 版画 然后,您可以获取