9

如何在Gin Gonic web golang 框架中将一些路由的代理 Web 请求反向到另一个后端

有没有办法直接在Handle函数中转发如下图?

router := gin.New() router.Handle("POST", "/api/v1/endpoint1", ForwardToAnotherBackend)

4

3 回答 3

11

这是我用于将特定端点子集从 gin 框架反向代理到另一个后端的解决方案:

router.POST("/api/v1/endpoint1", ReverseProxy()

func ReverseProxy() gin.HandlerFunc {

    target := "localhost:3000"

    return func(c *gin.Context) {
        director := func(req *http.Request) {
            r := c.Request
            req = r
            req.URL.Scheme = "http"
            req.URL.Host = target
            req.Header["my-header"] = []string{r.Header.Get("my-header")}
            // Golang camelcases headers
            delete(req.Header, "My-Header")
        }
        proxy := &httputil.ReverseProxy{Director: director}
        proxy.ServeHTTP(c.Writer, c.Request)
    }
}
于 2016-08-18T04:23:29.170 回答
3

您可以使用标准库httputil.ReverseProxy来做到这一点。

我还没有找到自己使用 gin 的理由,我喜欢尽可能坚持使用 stdlib。但是,我相信您可以将这个 ReverseProxy 处理程序包装起来,gin.WrapH()以便能够将它与您的 gin 路由器一起使用。

于 2016-08-16T12:27:57.457 回答
1

当您使用导演时:

req.URL.Scheme = "http"
req.Host, req.URL.Host = "google.com", "google.com"
于 2020-05-22T17:05:06.517 回答