一个利用go反向代理解决api转发的例子

实现的效果:

如果访问的url路径是类似 /163/  或 /163/debian 的形式,则转发到163开源镜像服务器

 

直接上代码:

package main

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

var fwdHost = "mirrors.163.com"  //http首部字段的HOST取值
var fwdTo = "http://" + fwdHost + "/"
var fwdPrefix = "/163/"

type forward struct {
    RProxy *httputil.ReverseProxy
}

func (f *forward) ServeHTTP(wr http.ResponseWriter, req *http.Request) {
    //fmt.Printf("http头部是:%+v\n", req.Header) //假设这是处理http头部的代码
    fmt.Printf(" #### REQ:%+v\n", req)

    //处理完后转发到网易163镜像
    req.URL.Path = req.URL.Path[len(fwdPrefix)-1:]
    req.RequestURI = req.RequestURI[len(fwdPrefix)-1:]
    req.Host = fwdHost
    fmt.Printf(" *** REQ:%+v\n", req)
    f.RProxy.ServeHTTP(wr, req)
}

func main() {
    var fwd forward
    u, _ := url.Parse(fwdTo)
    fwd.RProxy = httputil.NewSingleHostReverseProxy(u)
    http.Handle(fwdPrefix, &fwd) //所有请求将转发到网易163的debian镜像
    http.HandleFunc("/", notForward)
    http.HandleFunc("/api/v1/", notForward)
    log.Fatal(http.ListenAndServe(":3000", nil))
}

func notForward(wr http.ResponseWriter, req *http.Request) {
    wr.Write([]byte(fmt.Sprintf(`<html>
<body>
      <em>Not forward!!</em>
      <br />
      <i>url = %s</i>
</body>
</html>
`,req.URL.String())))
}

 

转载于:https://www.cnblogs.com/mind-water/p/11061034.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值