使用go, gin, gorm编写一个简单的curd的api接口

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://medium.com/@cgrant/developing-a-simple-crud-api-with-go-gin-and-gorm-df87d98e6ed1

人已赞赏
随笔日记

SpringCloud-config分布式配置中心

2020-11-9 3:50:22

随笔日记

Typescript高级类型与泛型难点详解

2020-11-9 3:50:24

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索