go-json-rest(https://github.com/ant0ine/go-json-rest/)是基于net/http的一个小封装,可帮助轻松构建RESTful JSON API。它使用基于Trie的实现提供快速和可拓展的请求路由,帮助处理JSON请求和响应。它拥有丰富的中间件,比如CORS,Auth,Gzip,Status等,可帮助实现和拓展功能。此外,还有一些与go-json-rest兼容的第三方中间件,比如JWT,AuthToken等。如下所示:
表格1 中间件
表格2 第三方中间件
使用命令进行安装:
go get github.com/ant0ine/go-json-rest/rest
新建一个main.go,导入go-json-rest,这里以一个简单例子进行说明:
package main
import (
"github.com/ant0ine/go-json-rest/rest"
"log"
"net/http"
)
func main() {
api := rest.NewApi()
api.Use(rest.DefaultDevStack...)
router, err := rest.MakeRouter(
rest.Get("/message", func(w rest.ResponseWriter, req *rest.Request) {
w.WriteJson(map[string]string{"Body": "Hello World!"})
}),
)
if err != nil {
log.Fatal(err)
}
api.SetApp(router)
http.Handle("/api/", http.StripPrefix("/api", api.MakeHandler()))
log.Fatal(http.ListenAndServe(":8080", nil))
}
在浏览器端输入http://localhost:8080/api/message,若打印出结果如下图所示,则表示运行成功。
可以按照设计模型、连接数据库、设计控制器、配置路由流程进行开发。
项目场景:需要实现一个用户管理系统,该系统主要是对用户的基本信息进行管理。
该系统最核心的是用户模块,模型设计时需要考虑的是用户的属性信息,比如邮箱、联系方式等等。模型构建如下,左边表示golang实现的结构体,右边表示数据表设计。
这里使用的gorm来操作数据库,它是golang语言写的ORM库。
源码地址:https://github.com/jinzhu/gorm
中文文档:http://gorm.book.jasperxu.com/
这一步骤主要是对数据库连接相关进行设置,使用时需要先下载安装gorm源码,然后导入gorm及驱动,下面展示gorm连接数据库示例:
package db
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
"time"
"log"
)
type BaseGorm struct {
DB *gorm.DB
}
var baseDB *gorm.DB
func (this *BaseGorm) InitDB() {
var err error
this.DB, err = gorm.Open("mysql", "root:@tcp(localhost:3306)/userdb?charset=utf8&parseTime=true&loc=Local")
if err != nil {
log.Fatal(err)
return
}
this.DB.SingularTable(true)
this.DB.DB().SetMaxIdleConns(10)
this.DB.DB().SetMaxOpenConns(100)
this.DB.DB().SetConnMaxLifetime(300*time.Second)
this.DB.LogMode(true)
baseDB = this.DB
}
func (this *BaseGorm) GetDB() (DB *gorm.DB) {
if baseDB != nil {
DB = baseDB
} else {
log.Fatal("DB not initial.")
return
}
return
}
设计控制器,其实就是接口的设计。因为这个系统主要是对用户的基本信息进行管理,大致可设计为:登陆、注册、退出、新增用户、修改用户、删除用户、查看用户(获取所有用户信息、获取指定id的用户信息)接口。
要实现接口,可按照三步走策略进行:第一步:解析获取数据(比如需要新增新用户,会post一些json类型数据;删除用户,需要delete到具体的id值等);第二步:通过gorm来操作数据库;第三步:返回结果,作出响应。下面展示的是查询指定id的用户信息接口实现:
func (userController *UserController) QueryUserById(w rest.ResponseWriter, r *rest.Request) {
returnJson := make(map[string]interface{})
//解析获取数据
id := r.PathParam("id")
userId, _ := strconv.Atoi(id)
//通过gorm操作数据库
baseGorm:=db.BaseGorm{}
userInfo, err := baseGorm.QueryUserInfoById(userId)
if err != nil {
log.Fatal(err)
//操作失败返回结果
returnJson["code"] = 1
returnJson["msg"] = err.Error()
panic(w.WriteJson(returnJson))
return
}
//操作成功返回结果
returnJson["code"] = 0
returnJson["msg"] = "query userInfo success!"
returnJson["user"] = userInfo
w.WriteJson(returnJson)
}
这一步骤需要将URI与接口进行对接,当客户端访问URI时,可以访问到对应的接口,获取期望的结果。当然,可以在这里使用中间件,比如AuthTokenMiddleware等。
package main
import (
"github.com/ant0ine/go-json-rest/rest"
"log"
"net/http"
"userMgmtDemo/controller"
"userMgmtDemo/db"
"userMgmtDemo/common"
)
func main() {
new(db.BaseGorm).InitDB()
api := rest.NewApi()
api.Use(rest.DefaultDevStack...)
// 使用第三方中间件AuthTokenMiddleware,对token进行验证
tokenAuthMiddleware := &common.AuthTokenMiddleware{
Realm: "jwt auth",
Authenticator: func(token string) string {
var baseGorm *db.BaseGorm
userInfo, count, err := baseGorm.QueryUseInfoByToken(token)
if err != nil || count == 0 {
return ""
} else {
return userInfo.Deadline
}
},//返回为空,则说明token验证不通过,不能继续访问接口;返回有值,再将其与数据库中的失效时间字段进行对比,判断是否失效,失效则不能继续访问接口
Authorizer: nil,
}
//使用go-json-rest自带的中间件IfMiddleware筛选判断
//因为login、register接口在使用时没有token,不能经过AuthTokenMiddleware中间件验证,因此需要将其过滤
api.Use(&rest.IfMiddleware{
Condition: func(request *rest.Request) bool {
var arr = []string{
"/login","/register",
}
for _, item := range arr {
if item == request.URL.Path {
return false
}
}
return true
},
IfTrue: tokenAuthMiddleware,
})
router, err := rest.MakeRouter(
rest.Post("/login",new (controller.WebController).Login),
rest.Post("/register",new (controller.WebController).Register),
rest.Put("/loginout/:id",new (controller.WebController).Loginout),
rest.Get("/users/:id", new (controller.UserController).QueryUserById),
rest.Get("/users",new (controller.UserController).QueryAllUser),
rest.Delete("/users/:id", new (controller.UserController).DeleteUser),
rest.Put("/users",new (controller.UserController).UpdateUser),
)
if err != nil {
log.Fatal(err)
}
api.SetApp(router)
http.Handle("/api/", http.StripPrefix("/api", api.MakeHandler()))
log.Fatal(http.ListenAndServe(":8080", nil))
}
至此,使用go-json-rest框架就开发完成了。如若需要测试接口是够运行正确,可以使用Postman工具进行测试,非常方便。
源码地址:https://download.csdn.net/download/yuyinghua0302/10400647