• 使用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, "%s hello world", 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 使用 go get 来下载库

    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", "./api.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("db connect error")
    	}
    	defer db.Close()    //延时调用函数
    	db.AutoMigrate(&User{})
    
    	r := gin.Default()
    	r.GET("/users", index)          //获取所有用户
    	r.GET("/users/:id", show)       //根据id获取用户
    	r.POST("/users", store)         //保存新用户
    	r.PUT("/users/:id", update)     //根据id更新用户
    	r.DELETE("/users/:id", destroy)  //根据id删除用户
    	_ = r.Run()
    }
    
    func index(c *gin.Context) {}
    
    func show(c *gin.Context) {}
    
    func store(c *gin.Context) {
    	var user User
    	_ = c.BindJSON(&user) 	//绑定一个请求主体到一个类型
    	db.Create(&user)
    	c.JSON(200, user)
    }
    
    func update(c *gin.Context) {}
    
    func destroy(c *gin.Context) {}
    
    

    postman 测试效果

    获取所有用户接口

    func index(c *gin.Context) {
    	var users []User
    	db.Find(&users)
    	c.JSON(200, users)
    }
    

    postman 测试效果

    获取指定id用户接口

    func show(c *gin.Context) {
    	id := c.Params.ByName("id")
    	var user User
    	db.First(&user, id)
    	if user.ID == 0 {
    		c.JSON(404, gin.H{"message": "user not found"})
    		return
    	}
    	c.JSON(200, user)
    }
    

    postman 测试效果

    更新和删除接口

    func update(c *gin.Context) {
    	id := c.Params.ByName("id")
    	var user User
    	db.First(&user, id)
    	if user.ID == 0 {
    		c.JSON(404, gin.H{"message": "user not found"})
    		return
    	} else {
    		_ = c.BindJSON(&user)
    		db.Save(&user)
    		c.JSON(200, user)
    	}
    }
    
    func destroy(c *gin.Context) {
    	id := c.Params.ByName("id")
    	var user User
    	db.First(&user, id)
    	if user.ID == 0 {
    		c.JSON(404, gin.H{"message": "user not found"})
    		return
    	} else {
    		_ = c.BindJSON(&user)
    		db.Delete(&user)
    		c.JSON(200, gin.H{"message": "delete success"})
    	}
    }
    

    End

    参考:https://medium.com/@cgrant/developing-a-simple-crud-api-with-go-gin-and-gorm-df87d98e6ed1

  • 相关阅读:
    NoSQL--非关系型的数据库是什么?
    PHP Header 缓存 --- Header 参数说明
    apple-touch-icon,shortcut icon和icon的区别
    shell 中数学计算总结
    Linux下停用和启用用户帐号
    tar 实现增量备份
    DOMContentLoaded事件
    Linux获取时间日期方法
    JavaScript判断浏览器类型及版本
    和学生们的合影-20171104-gaojj-zhangsc-dengxy-suhw-xuyc
  • 原文地址:https://www.cnblogs.com/luke44/p/developing-rest-api-with-go-and-gin.html
Copyright © 2020-2023  润新知