Buat API CRUD dengan Go

PHPz
Lepaskan: 2024-07-29 13:53:53
asal
853 orang telah melayarinya

Create a CRUD API with Go

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.

Prasyarat

  • Pergi 1.21
  • MySQL

Projek persediaan

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
Salin selepas log masuk

Buat pangkalan data ujian bernama "contoh" dan jalankan fail database.sql untuk mengimport jadual dan data.

Struktur projek

├─ .env
├─ main.go
├─ config
│  └─ db.go
├─ controllers
│  └─ product_controller.go
├─ models
│  └─ product.go
├─ public
│  └─ index.html
└─ router
   └─ router.go
Salin selepas log masuk

Fail projek

.env

Fail ini mengandungi maklumat sambungan pangkalan data.

DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=example
DB_USER=root
DB_PASSWORD=
Salin selepas log masuk

db.go

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
}

Salin selepas log masuk

router.go

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()
}

Salin selepas log masuk

product.go

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
}

Salin selepas log masuk

product_controller.go

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)
}

Salin selepas log masuk

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.

main.go

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()
}
Salin selepas log masuk

index.html

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>
Salin selepas log masuk
  • Banyak artikel lain akan menggunakan Postman sebagai klien HTTP untuk menguji API, tetapi artikel ini saya akan menggunakan JavaScript sebagai gantinya. Ini akan membantu anda memahami lebih terperinci apabila bekerja dengan permintaan HTTP pada bahagian klien.
  • Untuk memastikan fail ini bersih dan boleh dibaca, kami hanya akan menggunakan HTML dan JavaScript asas. Tiada perpustakaan tambahan seperti Rangka Kerja CSS atau Axios di sini.
  • Semua fungsi CRUD akan menggunakan Kaedah HTTP yang sesuai untuk menggunakan API.
  • showResponse(res) akan memformat objek JSON untuk menjadikannya lebih mudah dibaca.

Jalankan projek

go run main.go
Salin selepas log masuk

Buka pelayar web dan pergi ke http://localhost:8080

Menguji

Dapatkan Semua Produk

Klik butang "Dapatkan Produk". API akan mengembalikan semua data produk.

Create a CRUD API with Go

Dapatkan Produk Mengikut Id

Klik butang "Dapatkan Produk" dan masukkan "1" untuk id produk. API akan mengembalikan data produk.

Create a CRUD API with Go

Cipta Produk

Klik butang "Buat Produk" dan masukkan "uji-cipta" untuk nama produk dan "100" untuk harga. API akan mengembalikan produk yang baru dibuat.

Create a CRUD API with Go

Kemas kini Produk

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.

Create a CRUD API with Go

Padamkan Produk

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.

Create a CRUD API with Go

Kesimpulan

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!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!