Operasi CRUD (buat, baca, kemas kini, padam) ialah fungsi asas mana-mana aplikasi web apabila bekerja dengan pangkalan data. Contoh ini akan menunjukkan kepada anda cara membuat API CRUD dengan Go dan menggunakan MySQL sebagai pangkalan data.
Menyediakan kebergantungan projek Go.
go mod init app go get github.com/gin-gonic/gin go get gorm.io/gorm go get gorm.io/driver/mysql go get github.com/joho/godotenv
Buat pangkalan data ujian bernama "contoh" dan jalankan fail database.sql untuk mengimport jadual dan data.
├─ .env ├─ main.go ├─ config │ └─ db.go ├─ controllers │ └─ product_controller.go ├─ models │ └─ product.go ├─ public │ └─ index.html └─ router └─ router.go
Fail ini mengandungi maklumat sambungan pangkalan data.
DB_HOST=localhost DB_PORT=3306 DB_DATABASE=example DB_USER=root DB_PASSWORD=
Fail ini menyediakan sambungan pangkalan data menggunakan GORM. Ia mengisytiharkan pembolehubah global DB untuk memegang contoh sambungan pangkalan data untuk digunakan kemudian dalam aplikasi kami.
package config import ( "fmt" "os" "github.com/joho/godotenv" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/schema" ) var DB *gorm.DB func SetupDatabase() { godotenv.Load() connection := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true", os.Getenv("DB_USER"), os.Getenv("DB_PASSWORD"), os.Getenv("DB_HOST"), os.Getenv("DB_PORT"), os.Getenv("DB_DATABASE")) db, _ := gorm.Open(mysql.Open(connection), &gorm.Config{NamingStrategy: schema.NamingStrategy{SingularTable: true}}) DB = db }
Fail ini menyediakan penghalaan untuk aplikasi web Gin. Ia memulakan penghala, menyediakan fail index.html statik pada URL akar, mentakrifkan laluan API untuk operasi CRUD.
package router import ( "app/controllers" "github.com/gin-gonic/gin" ) func SetupRouter() { productController := controllers.ProductController{} router := gin.Default() router.StaticFile("/", "./public/index.html") router.Group("/api"). GET("/products", productController.Index). POST("/products", productController.Create). GET("/products/:id", productController.Get). PUT("/products/:id", productController.Update). DELETE("/products/:id", productController.Delete) router.Run() }
Fail ini mentakrifkan model Produk untuk aplikasi. Model ini digunakan untuk operasi pangkalan data yang melibatkan produk.
package models type Product struct { Id int `gorm:"primaryKey;autoIncrement"` Name string Price float64 }
Fail ini mentakrifkan semua fungsi yang diperlukan untuk mengendalikan permintaan masuk dan melaksanakan sebarang operasi CRUD.
package controllers import ( "app/config" "app/models" "net/http" "strconv" "github.com/gin-gonic/gin" ) type ProductController struct { } func (con *ProductController) Index(c *gin.Context) { var products []models.Product config.DB.Find(&products) c.JSON(http.StatusOK, products) } func (con *ProductController) Get(c *gin.Context) { var product models.Product config.DB.First(&product, c.Params.ByName("id")) c.JSON(http.StatusOK, product) } func (con *ProductController) Create(c *gin.Context) { var product models.Product c.BindJSON(&product) if err := config.DB.Create(&product).Error; err != nil { c.AbortWithError(http.StatusBadRequest, err) return } c.JSON(http.StatusOK, product) } func (con *ProductController) Update(c *gin.Context) { var product models.Product c.BindJSON(&product) product.Id, _ = strconv.Atoi(c.Params.ByName("id")) if err := config.DB.Updates(&product).Error; err != nil { c.AbortWithError(http.StatusBadRequest, err) return } c.JSON(http.StatusOK, product) } func (con *ProductController) Delete(c *gin.Context) { var product models.Product if err := config.DB.Delete(&product, c.Params.ByName("id")).Error; err != nil { c.AbortWithError(http.StatusBadRequest, err) return } c.Status(http.StatusOK) }
c.BindJSON() menghuraikan muatan JSON daripada badan permintaan ke dalam struct Go.
config.DB tika GORM yang digunakan untuk melaksanakan operasi pangkalan data yang diingini.
c.JSON() hantar respons JSON dengan hasil operasi dan kod status HTTP yang sesuai.
Fail ini adalah pintu masuk utama permohonan kami. Ia akan membuat dan menyediakan aplikasi web Gin.
package main import ( "app/config" "app/router" ) func main() { config.SetupDatabase() router.SetupRouter() }
Fail ini akan digunakan untuk mencipta antara muka pengguna asas untuk menguji API kami.
<!DOCTYPE html> <head> <style> li { margin-bottom: 5px; } textarea { width: 100%; } </style> </head> <body> <h1>Example CRUD</h1> <ul> <li><button onclick="getProducts()">Get Products</button></li> <li><button onclick="getProduct()">Get Product</button></li> <li><button onclick="createProduct()">Create Product</button></li> <li><button onclick="updateProduct()">Update Product</button></li> <li><button onclick="deleteProduct()">Delete Product</button></li> </ul> <textarea id="text_response" rows="20"></textarea> <script> function showResponse(res) { res.text().then(text => { let contentType = res.headers.get('content-type') if (contentType && contentType.startsWith('application/json')) { text = JSON.stringify(JSON.parse(text), null, 4) } document.getElementById('text_response').innerHTML = text }) } function getProducts() { fetch('/api/products').then(showResponse) } function getProduct() { let id = prompt('Input product id') fetch('/api/products/' + id).then(showResponse) } function createProduct() { let name = prompt('Input product name') let price = parseFloat(prompt('Input product price')) fetch('/api/products', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name, price }) }).then(showResponse) } function updateProduct() { let id = parseInt(prompt('Input product id to update')) let name = prompt('Input new product name') let price = parseFloat(prompt('Input new product price')) fetch('/api/products/' + id, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name, price }) }).then(showResponse) } function deleteProduct() { let id = prompt('Input product id to delete') fetch('/api/products/' + id, { method: 'DELETE' }).then(showResponse) } </script> </body> </html>
go run main.go
Buka pelayar web dan pergi ke http://localhost:8080
Klik butang "Dapatkan Produk". API akan mengembalikan semua data produk.
Klik butang "Dapatkan Produk" dan masukkan "1" untuk id produk. API akan mengembalikan data produk.
Klik butang "Buat Produk" dan masukkan "uji-cipta" untuk nama produk dan "100" untuk harga. API akan mengembalikan produk yang baru dibuat.
Klik butang "Kemas Kini Produk" dan masukkan "101" untuk id produk dan "kemas kini ujian" untuk nama dan "200" untuk harga. API akan mengembalikan produk yang dikemas kini.
Klik butang "Padam Produk" dan masukkan "101" untuk id produk. API tidak akan mengembalikan apa-apa, yang boleh diterima kerana kami tidak mengembalikan apa-apa daripada API kami.
Dalam artikel ini, anda telah mempelajari cara membuat dan menetapkan rangka kerja Gin untuk mencipta API CRUD. Gunakan GORM sebagai ORM untuk melaksanakan operasi CRUD pada pangkalan data. Uji API kami menggunakan JavaScript. Saya harap anda akan menikmati artikel itu.
Kod sumber: https://github.com/StackPuz/Example-CRUD-Go
Buat Apl Web CRUD: https://stackpuz.com
Atas ialah kandungan terperinci Buat API CRUD dengan Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!