Go 系列讲座: Gin+Jwt RestFul Api 后端一战到底 Gin 路由 model概述

853 阅读2分钟

Restful Api 的行为如下

先看一下Gin框架写的后端运行后的样子


[GIN-debug] POST   /api/auth/login           --> app/pkg/app/utils.Handler.func1 (2 handlers)
[GIN-debug] GET    /api/auth/info            --> app/pkg/app/utils.Handler.func1 (2 handlers)
[GIN-debug] POST   /api/auth/updatePassword  --> app/pkg/app/utils.Handler.func1 (2 handlers)
[GIN-debug] GET    /api/auth/logout          --> app/pkg/app/routers/auth.logout (2 handlers)
[GIN-debug] POST   /api/users/page           --> app/pkg/app/utils.Handler.func1 (2 handlers)
[GIN-debug] POST   /api/users/create         --> app/pkg/app/utils.Handler.func1 (2 handlers)
[GIN-debug] POST   /api/users/update         --> app/pkg/app/utils.Handler.func1 (2 handlers)

最简化理解上面的输出

就是POST 协议 uri为 /api/auth/login 的Api 由 app/pkg/app/utils.Handler.func1 这个函数来处理!

大家理解一下。这个就是gin的路由核心! 哪个uri 由哪个函数来处理。 那么下面的理解将迎刃而解!

Restful api 一般例子

HTTP 方法	行为	URI	示例说明
GET	获取资源列表	/users	获取用户列表
GET	获取一个具体的资源	/users/admin	获取 admin 用户的详细信息
POST	创建一个新的资源	/users	创建一个新用户
PUT	以整体的方式更新一个资源	/users/1	更新 id 为 1 的用户
DELETE	删除服务器上的一个资源	/users/1	删除 id 为 1 的用户
gin 路由 上面注册 api uri 与相关回调的例子
	// 注册/api/v1/users
			v1.GET("/users", cUser.Query)
			v1.GET("/users/:id", cUser.Get)
			v1.POST("/users", cUser.Create)
			v1.PUT("/users/:id", cUser.Update)
			v1.DELETE("/users/:id", cUser.Delete)
			v1.PATCH("/users/:id/enable", cUser.Enable)
			v1.PATCH("/users/:id/disable", cUser.Disable)

上面比如Post 方法 /users 这个request, 会调用cUser.Create 方法!

Controller

一般理解这个cUser.Create为其他web框架里面的Controller. 只不过go里面简化了.

model封装DB方法

举个例子

type User struct {
	Model
	RecordID string  `gorm:"column:record_id;size:36;index;"` // 记录内码
	UserName *string `gorm:"column:user_name;size:64;index;"` // 用户名
	RealName *string `gorm:"column:real_name;size:64;index;"` // 真实姓名
	Password *string `gorm:"column:password;size:40;"`        // 密码(sha1(md5(明文))加密)
	Email    *string `gorm:"column:email;size:255;index;"`    // 邮箱
	Phone    *string `gorm:"column:phone;size:20;index;"`     // 手机号
	Status   *int    `gorm:"column:status;index;"`            // 状态(1:启用 2:停用)
	Creator  *string `gorm:"column:creator;size:36;"`         // 创建者
}
// GetByUserID 根据用户ID获取用户角色对象列表
func (a UserRoles) GetByUserID(userID string) []*schema.UserRole {
	var list []*schema.UserRole
	for _, item := range a {
		if item.UserID == userID {
			list = append(list, item.ToSchemaUserRole())
		}
	}
	return list
}

controller 调用model层的方法.

一般只要两层就ok了, 不需要向java一样还要封装 repository 多层, 好多重复操作.

注册路由,及路由组


g := app.Group("/api")
	v1 := g.Group("/v1")
		{
			pub := v1.Group("/pub")
			{
				v1.GET("/users", cUser.Query)
			v1.GET("/users/:id", cUser.Get)
			v1.POST("/users", cUser.Create)
			v1.PUT("/users/:id", cUser.Update)
			v1.DELETE("/users/:id", cUser.Delete)
			v1.PATCH("/users/:id/enable", cUser.Enable)
			v1.PATCH("/users/:id/disable", cUser.Disable)
		}

/api/v1/users 组下面的路由注册. 在启动gin go api 调用流程基本就跑通了.

拓展。

一般 /users 由cUser.Query, 那么接下来怎么优雅的一路调到后端呢? 一般1, 封装一个controller g里面一般也可以是pkg 在封装一个数据库的model层。

ApiCallBack -----> Controller -----> Model -> DB