超级详细:Go语言框架Gin和Gorm实现一个完整的待办事项微服务( 二 )


const ( JSON_SUCCESS int = 1 JSON_ERRORint = 0)成功返回1 , 失败返回0 。
1 - 添加条目 add
主要的功能 , 是拿到POST表单提交的数据 , 并写入数据库 , 成功则返回信息通知 , 失败则给出相应提示 。
// 创建TODO条目func add(c *gin.Context) { completed, _ := strconv.Atoi(c.PostForm("completed")) todo := todoModel{Title: c.PostForm("title"), Completed: completed} db.Save(&todo) c.JSON(http.StatusOK, gin.H{"status":JSON_SUCCESS,"message":"创建成功","resourceId": todo.ID, })}注意我们对于POST提供的字段 completed 进行了转换 , 因为表单数据默认都是字符串类型 , 而todoModel内Completed是int类型 , 所以需要进行转换 。
2 - 获取所有条目
不接受任何参数 , 默认给出所有的条目内容 。
// 获取所有条目func all(c *gin.Context) { var todos []todoModel var _todos []fmtTodo db.Find(&todos) // 没有数据 if len(todos) <= 0 {c.JSON(http.StatusOK, gin.H{"status":JSON_ERROR,"message": "没有数据",})return } // 格式化 for _, item := range todos {completed := falseif item.Completed == 1 {completed = true} else {completed = false}_todos = append(_todos, fmtTodo{ID:item.ID,Title:item.Title,Completed: completed,}) } c.JSON(http.StatusOK, gin.H{"status":JSON_SUCCESS,"message": "ok","data":_todos, })}为了API返回数据的便于使用 , 我们使用了一个结构体 fmtTodo 用于将结构体 todoModel 的数据进行格式化 。 如果没有查询到任何数据 , 返回状态码 status = 0 。
3 - 获取单个条目
在路由中附加的id , 可以调用此路由 , 用于返回单条数据 。
// 根据id获取一个条目func take(c *gin.Context) { var todo todoModel todoID := c.Param("id") db.First(&todo, todoID) if todo.ID == 0 {c.JSON(http.StatusNotFound, gin.H{"status":JSON_ERROR,"message": "条目不存在",})return } completed := false if todo.Completed == 1 {completed = true } else {completed = false } _todo := fmtTodo{ID:todo.ID,Title:todo.Title,Completed: completed, } c.JSON(http.StatusOK, gin.H{"status":JSON_SUCCESS,"message": "ok","data":_todo, })}根据ID查询数据 , 如果存在就返回 , 并使用fmtTodo进行格式化;如果不存在 , 状态码等于0 。
4 - 更新单个条目
已经存在的数据 , 根据ID对其内容进行修改 。 如果ID不存在 , 返回错误信息 。
// 更新一个条目func update(c *gin.Context) { var todo todoModel todoID := c.Param("id") db.First(&todo, todoID) if todo.ID == 0 {c.JSON(http.StatusNotFound, gin.H{"status":JSON_ERROR,"message": "条目不存在",})return } db.Model(&todo).Update("title", c.PostForm("title")) completed, _ := strconv.Atoi(c.PostForm("completed")) db.Model(&todo).Update("completed", completed) c.JSON(http.StatusOK, gin.H{"status":JSON_SUCCESS,"message": "更新成功", })}5 - 删除单个条目
根据ID查询是否存在 , 如果存在就进行删除 。
// 删除条目func del(c *gin.Context) { var todo todoModel todoID := c.Param("id") db.First(&todo, todoID) if todo.ID == 0 {c.JSON(http.StatusOK, gin.H{"status":JSON_ERROR,"message": "条目不存在",})return } db.Delete(&todo) c.JSON(http.StatusOK, gin.H{"status":JSON_SUCCESS,"message": "删除成功!", })}以上就是5个方法的具体实现 , 只能用作demo , 而不能用于生产 。 因为表单数据的有效性检测 , 我们在代码中并没有实现 。 这在线上是绝对不允许的 。
还有一些数据的鉴权 , 用户身份权限鉴定 , 本示例中都没有 。
使用curl测试完成以上步骤 , 该todo清单功能基本完善 , 我们使用
go build main.go进行编译 , 如果不出错 , 编译通过后 , 会生成 main.exe 文件 。 我们在命令行直接运行该文件 , 结果如下图 。
超级详细:Go语言框架Gin和Gorm实现一个完整的待办事项微服务文章插图
下面我们对五个url分别进行测试 。
首先是获取所有的条目 ,
curl -s -X GET http://localhost:9089/api/v1/todo/ 这会命中第二条路由规则 , 返回值如下:
{"message":"没有数据","status":0}暂时没有数据 。 接着添加一个条目:
curl -s -X POST -d "title=Talk is cheap, show me the code." -d "completed=0" http://localhost:9089/api/v1/todo/ 执行成功返回数据
{"message":"创建成功","resourceId":8,"status":1}接着我们再查询所有的条目 , 看看能否找到:
返回结果如下:
{"data":[{"id":8,"title":"Talk is cheap, show me the code.","completed":false}],"message":"ok","status":1}为了演示方便 , 我们再随机写入几条数据 , 然后测试单条数据查询 , 修改 , 和删除 。
curl -s -X POST -d "title=Life is short, I use python." -d "completed=0" http://localhost:9089/api/v1/todo/ curl -s -X POST -d "title=Zen of Golang." -d "completed=0" http://localhost:9089/api/v1/todo/ curl -s -X POST -d "title=Do not repeat yourself." -d "completed=0" http://localhost:9089/api/v1/todo/