go 是一门非常灵活的语言, 既具有静态语言的高性能, 又有动态语言的开发速度快的优点, 语法也比较简单, 本例就通过简单的代码实现了一个简单的增删改查 API 接口
hello world
常规版
新建 demo1.go 并输入以下代码, 进入命令行, go run demo1.go , 就可以看到命令行输出 hello world
- package main
- import "fmt"
- func main() {
- fmt.Println("hello word")
- }
网络版
使用 go 标准库 http 可以很容易建立一个 http 服务, 保存以下代码为 demo2.go
- package main
- import (
- "fmt"
- "net/http"
- )
- func main() {
- http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
- fmt.Fprintf(w, "hello world, %s", r.Method)
- })
- http.ListenAndServe(":8080", nil)
- }
使用 go run 命令, 打开浏览器 http://127.0.0.1:8080/ 查看效果.
通过观察上面, 发现 go 程序代码的结构为: 包申明 -> 导入包 -> 函数. 其中 main 包说明该程序是一个独立的程序, main 函数是入口函数
gin
地址: https://github.com/gin-gonic/gin
gin 是一个基于 http 库的轻量级 go 框架, 只要几行代码就可以起一个 API 服务, 使用前需要下载这个库,
- demo
- $ go get GitHub.com/gin-gonic/gin
- package main
- import "github.com/gin-gonic/gin"
- func main() {
- r := gin.Default() // 返回一个默认的 gin 实例
- r.GET("/ping", func(c *gin.Context) {
- c.JSON(200, gin.H{
- "message": "pong",
- })
- })
- r.Run() // 默认在 0.0.0.0:8080 上监听并服务
- }
保存上面代码在 API.go 中, 运行 go run API.go, 浏览器或 postman 打开 http://127.0.0.1:8080/ping 查看效果
gorm
文档: https://jasperxu.github.io/gorm-zh/
gorm 是一个类似于 Laravel 中的 Eloquent ORM, 支持 MySQL,SQLite 等多种数据库, 使用前请下载
- $ go get GitHub.com/jinzhu/gorm
- $ go get GitHub.com/mattn/go-sqlite3 //SQLite 驱动
- curd API
利用以上包, 编写一个对用户资料实现增删改查的接口
新增用户接口
- package main
- import (
- "github.com/gin-gonic/gin"
- "github.com/jinzhu/gorm"
- _ "github.com/jinzhu/gorm/dialects/sqlite"
- "log"
- )
- var db *gorm.DB
- var err error
- type User struct {
- ID uint `json:"id"`
- Name string `json:"name"`
- Email string `json:"email"`
- }
- func main() {
- db, err = gorm.Open("sqlite3", "./demo.db")
- // 使用 MySQL
- //gorm.Open("mysql", "user:pwd@tcp(127.0.0.1:3306)/dbname?charset=utf8&parseTime=True&loc=Local")
- if err != nil {
- log.Fatal("数据库连接失败")
- }
- defer db.Close() // 延时调用函数
- db.AutoMigrate(User{})
- r := gin.Default()
- r.GET("/users", GetUsers) // 获取所有用户
- r.GET("/users/:id", GetUser) // 根据 id 获取用户
- r.POST("/users", StoreUsers) // 保存新用户
- r.PUT("/users/:id", UpdateUser) // 根据 id 更新用户
- r.DELETE("/users/:id", DeleteUser) // 根据 id 删除用户
- r.Run()
- }
- func GetUsers(c *gin.Context) {}
- func GetUser(c *gin.Context) {}
- func StoreUsers(c *gin.Context) {
- var user User
- c.BindJSON(&user) // 绑定一个请求主体到一个类型
- db.Create(&user)
- c.JSON(200, user)
- }
- func UpdateUser(c *gin.Context) {}
- func DeleteUser(c *gin.Context) {}
使用 postman 测试
获取所有用户接口
- func GetUsers(c *gin.Context) {
- var users []User
- if err = db.Find(&users).Error; err != nil {
- c.AbortWithStatusJSON(500, err)
- } else {
- c.JSON(200, users)
- }
- }
postman 测试效果
获取指定 id 用户接口
- func GetUser(c *gin.Context) {
- id := c.Params.ByName("id")
- var user User
- if err := db.Where("id = ?", id).First(&user).Error; err != nil {
- c.AbortWithStatusJSON(500, err)
- } else {
- c.JSON(200, user)
- }
- }
用 postman 请求 http://127.0.0.1:8080/users/2 如图
更新和删除接口
- func UpdateUser(c *gin.Context) {
- var user User
- id := c.Params.ByName("id")
- if err := db.Where("id = ?", id).First(&user).Error; err != nil {
- c.AbortWithStatusJSON(500, err)
- }
- if user.ID> 0 {
- c.BindJSON(&user)
- db.Save(&user)
- c.JSON(200, user)
- }
- }
- func DeleteUser(c *gin.Context) {
- id := c.Params.ByName("id")
- var user User
- db.Where("id = ?", id).Delete(&user)
- c.JSON(200, gin.H{"id #" + id: "deleted"})
- }
- End
参考:
来源: https://www.cnblogs.com/luke44/p/developing-rest-api-with-go-and-gin.html