go-json-rest框架实现Golang Restful API项目的开发

一、go-json-rest框架介绍
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-json-rest的简单实用
使用命令进行安装:

go get github.com/ant0ine/go-json-rest/rest
新建一个main.go,导入go-json-rest,这里以一个简单例子进行说明:
在浏览器端输入http://localhost:8080/api/message,若打印出结果如下图所示,则表示运行成功。

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))
}

三、go-json-rest在项目中开发
可以按照设计模型、连接数据库、设计控制器、配置路由流程进行开发。

项目场景:需要实现一个用户管理系统,该系统主要是对用户的基本信息进行管理。

设计模型
该系统最核心的是用户模块,模型设计时需要考虑的是用户的属性信息,比如邮箱、联系方式等等。模型构建如下,左边表示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工具进行测试,非常方便。

发布了19 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/ltk80/article/details/89081596