在golang gow 框架中,使用 HTTP API 的反向代理

Golang 归档:202007
普通
浏览:4251
2020-07-29 14:44:58
在golang gow框架,使用HTTP API 的反向代理, 主要使用了golang基础库里的 httputil.ReverseProxy,可观看两个完整的实例代码

在golang HTTP API的开发中,偶尔会碰到,需要在某个子项目中,反向代理其他API的情况,下面是一个例子,供参考:

代码中使用了gow框架:

https://github.com/zituocn/gow

实现代码:

package main

import (
    "bytes"
    "compress/gzip"
    "fmt"
    "github.com/zituocn/gow"
    "io/ioutil"
    "net/http"
    "net/http/httputil"
    "net/url"
)

func main() {
    r := gow.Default()
    r.Any("/{match_all}", httpReverseProxyHandler)
    r.Run()

}

var (
    // 上层网站或接口(被反向代理的接口)
    website, _ = url.Parse("https://www.baidu.com")
)

func httpReverseProxyHandler(c *gow.Context) {
    simpleHostProxy := httputil.ReverseProxy{
        Director: func(req *http.Request) {
            req.URL.Scheme = website.Scheme
            req.URL.Host = website.Host
            req.Host = website.Host
        },

        ModifyResponse: func(resp *http.Response) error {
            if resp.Header.Get("Content-Encoding") == "gzip" {
                resp.Header.Del("Content-Encoding")
                gzipBody, err := gzip.NewReader(resp.Body)
                if err != nil {
                    return err
                }
                resp.Body = gzipBody
            }

            //如果要对resp.Body做些处理
            // 拿出数据
            body,err:=ioutil.ReadAll(resp.Body)
            if err!=nil{
                return err
            }
            resp.ContentLength = int64(len(body))
            fmt.Println(string(body))


            //把数据丢回去
            resp.Body = ioutil.NopCloser(bytes.NewReader(body))

            return nil
        },
    }

    simpleHostProxy.ServeHTTP(c.Writer, c.Request)
}

使用浏览器访问

http://127.0.0.1:8080
注意事项
  • 此文章对你有帮助,对作者表示感谢(微信):
  • 本文地址:https://22v.net/article/3260/
  • 转载本文时,请注明转载自“SamBlog”的字样。
  • 如此文章有损您的合法权益,请使用页面底部的邮箱与我取得联系。
分类目录
文章归档
友情站点