一个利用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(`

      Not forward!!
      
url = %s `,req.URL.String()))) }

 

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

你可能感兴趣的:(一个利用go反向代理解决api转发的例子)