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