上文《Go语言Web开发系列(十三)Gin web框架操作mysql存储案例》我们演示gin web+mysql的案例的时候,大家可以发现一个问题,就是我们在每一个方法里面都是使用
c.JSON(200, gin.H{ "code": 200, "message": "登录成功", })
在真实开发环境里面,其实我们一般都是会直接封装一个统一的返回json结构体,例如:
{ "code": 200, "msg": "请求成功", "data": null }
这样子的话,我们每个接口里面都写一遍这个,是不是很麻烦,所以我们需要的就是封装一个统一返回的结构体。这里的封装也比较方便,主要是编写一个方法,把相关的参数传递进来即可,示例:
func Ok(c *gin.Context, code int, msg string, data any) { c.JSON(http.StatusOK, gin.H{ "code": code, "msg": msg, "data": data, }) }
然后在代码里面调用这个方法即可,例如:
Ok(c, 200, "登录成功", user)
示例图如下:
然后我们把项目运行起来,可以看到返回的格式都是统一的,如下图:
这样子是不是很方便?
备注:
1、这里的话由于我们的web返回的主要是3个字段,code,msg,data,相对来说简单,所以就没有专门写一个struct结构体,直接使用的json组合起来的。 2、处理成功或者失败事件都可以这么封装。
最后附上我们修改后的完整代码,大家可以试试:
// demo1 project main.go package main import ( "database/sql" "log" "net/http" "time" "github.com/gin-gonic/gin" _ "github.com/go-sql-driver/mysql" ) type Users struct { Id int Name string NickName string } /* * 创建数据库连接 */ func connectToDatabase() (*sql.DB, error) { db, err := sql.Open("mysql", "root:123456@tcp(192.168.31.217:33306)/test") if err != nil { return nil, err } db.SetConnMaxLifetime(time.Second * 3600 * 8) db.SetMaxOpenConns(10) db.SetMaxIdleConns(10) err = db.Ping() if err != nil { return nil, err } return db, nil } func main() { //创建数据库连接 db, err := connectToDatabase() if err != nil { panic(err) } //程序关闭的时候需要关闭掉数据库连接 defer db.Close() router := gin.Default() //用户登录 router.POST("/login", func(c *gin.Context) { username := c.PostForm("username") password := c.PostForm("password") log.Println("获取到的用户名和密码是:", username, password) rows, err := db.Query("SELECT id FROM users WHERE username = ? and password = ?", username, password) if err != nil { log.Fatal(err) } defer rows.Columns() if rows.Next() == true { Ok(c, 200, "登录成功", nil) } else { Error(c, 400, "用户名或者密码不正确") } }) //用户注册 router.POST("/register", func(c *gin.Context) { username := c.PostForm("username") password := c.PostForm("password") nickname := c.PostForm("nickname") log.Println("获取到的用户名和密码是:", username, password) inserSql := "insert into users(username,password,nickname) values(?,?,?)" // 创建事务 tx, err := db.Begin() if err != nil { log.Println("事务创建失败:", err) return } // 执行插入语句 _, err = tx.Exec(inserSql, username, password, nickname) //value输入具体的值 if err != nil { log.Println("插入数据失败:", err) tx.Rollback() // 回滚事L务 return } // 提交事务 err = tx.Commit() if err != nil { log.Println("提交事务失败:", err) return } Ok(c, 200, "注册成功", nil) }) //获取用户信息 router.POST("/getUinfo/:username", func(c *gin.Context) { username := c.Param("username") var user Users querySql := "SELECT id, username, nickname FROM users WHERE username = ?" err = db.QueryRow(querySql, username).Scan(&user.Id, &user.Name, &user.NickName) if err != nil { log.Fatal(err) } Ok(c, 200, "登录成功", user) }) //修改用户信息 router.POST("/updateUinfo", func(c *gin.Context) { username := c.PostForm("username") nickname := c.PostForm("nickname") updateSql := "update users set nickname= ? WHERE username = ?" _, err = db.Exec(updateSql, nickname, username) if err != nil { log.Fatal(err) } Ok(c, 200, "修改成功", nil) }) //删除用户信息 router.POST("/deleteU/:username", func(c *gin.Context) { username := c.Param("username") updateSql := "delete from users WHERE username = ?" _, err = db.Exec(updateSql, username) if err != nil { log.Fatal(err) } Ok(c, 200, "删除成功", nil) }) router.Run(":9000") } func Error(c *gin.Context, code int, msg string) { c.JSON(http.StatusOK, gin.H{ "code": code, "message": msg, }) } func Ok(c *gin.Context, code int, msg string, data any) { c.JSON(http.StatusOK, gin.H{ "code": code, "msg": msg, "data": data, }) }
还没有评论,来说两句吧...