Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了XGoServer 一个基础性、模块完整且安全可靠的服务端框架大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

一个基础性、模块完整且安全可靠的服务端框架

开源地址:

第一版介绍文章:

<h4 id="新添加模块">新添加模块

  • 自定义路由接口
  • Token模块,jwt
  • 加解密模块,cipher-AES,可自行拓展其他
  • 各模块对应的单元测试例子

  • 自定义路由接口
  • Token模块,jwt
  • 加解密模块,cipher-AES,可自行拓展其他
  • 日志模块,alecthomas/log4go
  • 路由模块,gorilla/mux
  • 硬存储 / 软存储 采用 xorm 框架
  • 服务端通用的输出数据结构的整合,例如 json
  • 各模块对应的单元测试例子

自定义路由接口">自定义路由接口

requireToken 标识该路由是否需要 token 验证

TokenData 是我们要组合到 token 里面的数据结构 struct

type Context struct {
    TokenData TokenData
    TokenStr  String    `json:"tokenStr"`
    Ipaddress String    `json:"ipaddress"`  // client 的 ip
    RoutePath String    `json:"routePath"`
}
type XHandler struct {
    handleFunc   func(*Context,http.ResponseWriter,*http.request)
    requireToken bool
}
func (x XHandler) Servehttp(w http.ResponseWriter,r *http.request)  {
    tokenStr := r.Header.Get(TokenAuth)
    c := &Context{}
    c.Ipaddress = util.GetIpaddress(r)
    c.RoutePath = r.URl.Path
    if x.requireToken {
        tokenData,err := ParseToken(tokenStr) // 使用 token 模块进行解析
        if err != nil {
            util.RenderJson(w,util.GetCommonErr(err.Error()))
            return
        }
        c.TokenData = *tokenData
        c.TokenStr  = tokenStr
        // util.RenderJson(w,C)
        x.handleFunc(c,w,r)
        return
    }
    // 不需要 token
    util.LogInterface(C)
    x.handleFunc(c,r)
}

用法">用法

  • router.Handle("/get1",core.ApiNormalHandler(getToken)).Methods("GET")
  • router.Handle("/get2",core.ApirequestTokenHandler(handleToken)).Methods("GET")
  • 搭配使用:
router.Handle("/getToken",core.ApiNormalHandler(getToken)).Methods("GET")
router.Handle("/handleToken",core.ApirequestTokenHandler(handleToken)).Methods("GET")
router.HandleFunc("/enc",encOutput).Methods("GET")
router.HandleFunc("/dec",decOutput).Methods("POST")

输出一条-json-给客户端">直接输出一条 json 给客户端

func main()  {
    router := new (mux.Router)
    router.HandleFunc("/",test2).Methods("GET")
    core.httpListen(router)
}
func test2(w http.ResponseWriter,r *http.request)  {
    // 非常简单的例子,操作放在内部,可以使用 request 来获取自己的参数,再直接组织输出
    core.HandlerMapWithOutputJson(w,func() map[String]interface{} {
        m :=  map[String]interface{}{}
        m["msg"] = "blow me a kiss"
        return m
    })
}
// 结果 : {"msg":"blow me a kiss"}

生成-token-返回">登陆成功生成 token 返回

token 是具备过期时间的,皆可自定义

func getToken(c *core.Context,w http.ResponseWriter,r *http.request)  {
    core.HandlerMapWithOutputJson(w,func() map[String]interface{} {
        tokenStr,err := core.buildDefaultToken(func(tokenData *core.TokenData) {
            tokenData.UserId = "123456"  // 用户 id
            tokenData.Roles  = "normal"  // 用户角色
        })
        if err != nil {
            return util.GetCommonErr(err.Error())
        }
        return util.GetCommonsuccess(tokenStr)
    })
}
结果:
{
    "msg": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMTIzNDU2Iiwicm9sZXMiOiJub3JtYWwiLCJwcm9wcyI6bnVsbCwiZXhwIjoxNTE5MDA2Njg4LCJpYXQiOje1MTkwMDY2Mjh9.NsBsQ3xpOJNZUXO5Dc-Yk4p4m6p4EeDWgEfc5BaNKd4","ret": "success"
}

输出解析后的-context">直接输出解析后的 Context

tokenStr 是 Context 一变量

handleToken 方法对于的是 ApirequestTokenHandler

func handleToken(c *core.Context,r *http.request)  {
    util.RenderJson(w,context)
}

输出加密的数据">输出加密的数据

tokenStr 是 Context 一变量

handleToken 方法对于的是 ApirequestTokenHandler

type IEncrypt interface {
    AesEncrypt(origData,key []bytE) ([]byte,error)   // 加密
    AesDecrypt(encrypted,error)  // 解密
}
// 加密输出
func encOutput(w http.ResponseWriter,func() map[String]interface{} {
        d := "狗年平安"
        aes := encrypt.DefaultAES{}
        return util.GetCommonsuccess(aes.AesEncryptStr(d))
    })
}
输出{
    "msg": "\ufffd\u0002\ufffd\u001eu\ufffd\u001c\ufffd\u0013m\ufffdM\\\ufffd\ufffd\u0011","ret": "success"
}

数据库交互">与数据库交互

func test3(w http.ResponseWriter,func() map[String]interface{} {
        // 插入一条评论
        item := &model.Comment{
            Id  :util.NewId(),// 评论 id
            UserId  :"123456",// 评论人 id
            Name    :"LinGuanHong",// 评论名称
            Content :"Hello word",// 评论内容
        }
        affect,_ := core.ENGIne.Insert(item)  // 执行插入,传入 struct 引用
        m :=  map[String]interface{}{}
        if affect > 0 {
            m["ret"] = "insert success"
            comments := make([]model.Comment,0)
            core.ENGIne.Find(&comments)   // SELEct 出来,获取所有评论输出
            m["msg"] = comments
        }else{
            m["ret"] = "insert Failed"
        }
        return m
    })
}

输出的结果是:
{
"msg": [
{
"id": "1kubpgh9pprrucy11e456fyytw","UserId": "123456","name": "LinGuanHong","content": "Hello word"
}
],"ret": "insert success"
}

<h3 id="上述的功能结合使用便可做到牢固的安全性此外可以再结合-https-级别的路由使用">上述的功能结合使用,便可做到牢固的安全性。此外,可以再结合 https 级别的路由使用。

大佬总结

以上是大佬教程为你收集整理的XGoServer 一个基础性、模块完整且安全可靠的服务端框架全部内容,希望文章能够帮你解决XGoServer 一个基础性、模块完整且安全可靠的服务端框架所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: