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

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

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

代码中使用了gow框架:

https://github.com/gkzy/gow

原始接口代码

package main

import (
    "github.com/gkzy/gow"
)

func main() {
    r := gow.Default()

    v1 := r.Group("/v1")
    user := v1.Group("/user")
    user.Use(UserAuth()) // token权限检查
    user.GET("/:uid", GetUser)   //  GET /v1/user/1 可访问
    user.POST("/:uid", SaveUser)    // POST /v1/user/1 可访问

    r.Run(":9090")  //启动在127.0.0.1:9090
}

// Response Response
type Response struct {
    Code int         `json:"code"`
    Msg  string      `json:"msg"`
    Data interface{} `json:"data"`
}

// UserInfo user struct
type UserInfo struct {
    Nickname string `json:"nickname"`
    Address  string `json:"address"`
}

//UserAuth verify token
func UserAuth() gow.HandlerFunc {
    return func(c *gow.Context) {
        token := c.GetHeader("token")
        if token != "1234567890" {
            c.JSON(&Response{
                Code: 101,
                Msg:  "无权限访问",
            })
            c.StopRun()
        }
        c.Next()
    }
}

// GetUser
func GetUser(c *gow.Context) {

    user := &UserInfo{
        Nickname: "新月却泽滨",
        Address:  "四川成都",
    }
    c.JSON(&Response{
        Code: 0,
        Msg:  "success",
        Data: user,
    })
}

// SaveUser
func SaveUser(c *gow.Context) {
    user := new(UserInfo)
    err := c.DecodeJSONBody(&user)
    if err != nil {
        c.JSON(&Response{
            Code: 1,
            Msg:  "error",
        })
        return
    }

    c.JSON(&Response{
        Code: 0,
        Msg:  "success",
        Data: user,
    })
}

反向代理代码

package main

import (
    "github.com/gkzy/gow"
    "net/http"
    "net/http/httputil"
)

func main() {
    r := gow.Default()
    v1 := r.Group("/v1/")
    v1.Use(APIAuth())
    v1.Any("/*action", httpReverseProxyHandler)   // /v1/ 下的所有接口
    r.Run()  //默认跑在127.0.0.1:8080
}

const (
    Host = "127.0.0.1:9090"  //上层接口(被反向代理的接口)
)

// httpReverseProxyHandler 反向代理handler
func httpReverseProxyHandler(c *gow.Context) {
    simpleHostProxy := httputil.ReverseProxy{
        Director: func(req *http.Request) {
            req.URL.Scheme = "http"
            req.URL.Host = Host
            req.Host = Host
            req.Header.Set("token", "1234567890")  //传递上层接口需要的token验证
        },
    }

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

// APIAuth 反代接口的middleware
//      可以此处理一些代理后接口的验证
func APIAuth() gow.HandlerFunc {
    return func(c *gow.Context) {
        c.Next()
    }
}
注意事项
  • 此文章对你有帮助,对作者表示感谢(微信):
  • 本文地址:https://22v.net/article/3260/
  • 转载本文时,请注明转载自“SamBlog”的字样。
  • 如此文章有损您的合法权益,请使用页面底部的邮箱与我取得联系。
分类目录
文章归档
友情站点