当前位置: 首页>后端>正文

go restfull api框架 go语言restful框架

一、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等。如下所示:

go restfull api框架 go语言restful框架,go restfull api框架 go语言restful框架_golang restful api,第1张

表格1  中间件

go restfull api框架 go语言restful框架,go restfull api框架 go语言restful框架_go_02,第2张

表格2  第三方中间件

二、go-json-rest的简单实用

使用命令进行安装:

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,若打印出结果如下图所示,则表示运行成功。

go restfull api框架 go语言restful框架,go restfull api框架 go语言restful框架_go-json-rest_03,第3张

三、go-json-rest在项目中开发

可以按照设计模型、连接数据库、设计控制器、配置路由流程进行开发。

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

  • 设计模型

该系统最核心的是用户模块,模型设计时需要考虑的是用户的属性信息,比如邮箱、联系方式等等。模型构建如下,左边表示golang实现的结构体,右边表示数据表设计。

go restfull api框架 go语言restful框架,go restfull api框架 go语言restful框架_golang restful api_04,第4张

go restfull api框架 go语言restful框架,go restfull api框架 go语言restful框架_go-json-rest_05,第5张

  • 连接数据库

这里使用的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工具进行测试,非常方便。

go restfull api框架 go语言restful框架,go restfull api框架 go语言restful框架_golang restful api_06,第6张


https://www.xamrdz.com/backend/3l61942352.html

相关文章: