首頁 >後端開發 >Golang >使用 Go 建立 CRUD API

使用 Go 建立 CRUD API

PHPz
PHPz原創
2024-07-29 13:53:53925瀏覽

Create a CRUD API with Go

CRUD 操作(建立、讀取、更新、刪除)是任何 Web 應用程式使用資料庫時的基本功能。此範例將向您展示如何使用 Go 建立 CRUD API 並使用 MySQL 作為資料庫。

先決條件

  • 去1.21
  • MySQL

設定項目

設定 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

建立一個名為「example」的測試資料庫,並執行database.sql檔案導入表和資料。

專案結構

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

專案文件

.env

此文件包含資料庫連線資訊。

DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=example
DB_USER=root
DB_PASSWORD=

資料庫Go

此文件使用 GORM 設定資料庫連線。它聲明了一個全域變數 DB 來保存資料庫連線實例,以便稍後在我們的應用程式中使用。

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
}

路由器.go

此檔案為 Gin Web 應用程式設定路由。它初始化一個路由器,在根 URL 處提供一個靜態的 index.html 文件,定義用於 CRUD 操作的 API 路由。

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

產品.go

此文件定義應用程式的產品模型。此模型用於涉及產品的資料庫操作。

package models

type Product struct {
    Id int `gorm:"primaryKey;autoIncrement"`
    Name string
    Price float64
}

產品控制器.go

此文件定義了處理傳入請求和執行任何 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() 將請求正文中的 JSON 負載解析為 Go 結構體。

config.DB 用於執行所需資料庫操作的 GORM 實例。

c.JSON() 傳送帶有操作結果和對應 HTTP 狀態碼的 JSON 回應。

主機程式

該檔案是我們應用程式的主要入口點。它將創建並設定 Gin Web 應用程式。

package main

import (
    "app/config"
    "app/router"
)

func main() {
    config.SetupDatabase()
    router.SetupRouter()
}

索引.html

此文件將用於建立用於測試我們的 API 的基本使用者介面。

<!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>
  • 許多其他文章都會使用 Postman 作為 HTTP 用戶端來測試 API,但本文我將使用 JavaScript 來取代。這將幫助您在客戶端處理 HTTP 請求時了解更多細節。
  • 為了保持此文件乾淨且可讀,我們將只使用基本的 HTML 和 JavaScript。這裡沒有額外的函式庫,例如 CSS Framework 或 Axios。
  • 所有 CRUD 函數都會使用適當的 HTTP 方法來呼叫 API。
  • showResponse(res) 將格式化 JSON 物件以使其更易於閱讀。

運行專案

go run main.go

開啟網頁瀏覽器並前往http://localhost:8080

測試

獲取所有產品

點選「取得產品」按鈕。 API將傳回所有產品資料。

Create a CRUD API with Go

透過 ID 取得產品

點選「取得產品」按鈕並輸入「1」作為產品 ID。該API將傳回一個產品資料。

Create a CRUD API with Go

創建產品

點選「建立產品」按鈕,輸入「test-create」作為產品名稱,「100」作為價格。 API 將傳回一個新建立的產品。

Create a CRUD API with Go

更新產品

點選「更新產品」按鈕,輸入「101」作為產品 ID,「test-update」作為名稱,「200」作為價格。 API 將傳回更新的產品。

Create a CRUD API with Go

刪除產品

點選「刪除產品」按鈕並輸入「101」作為產品 ID。 API 不會回傳任何內容,這是可以接受的,因為我們不會從 API 傳回任何內容。

Create a CRUD API with Go

結論

在本文中,您學習如何建立和設定 Gin 框架以建立 CRUD API。使用 GORM 作為 ORM 對資料庫執行 CRUD 操作。使用 JavaScript 測試我們的 API。我希望您會喜歡這篇文章。

原始碼:https://github.com/StackPuz/Example-CRUD-Go

建立 CRUD Web 應用程式:https://stackpuz.com

以上是使用 Go 建立 CRUD API的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn