使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM