ホームページ  >  記事  >  バックエンド開発  >  Go で CRUD API を作成する

Go で CRUD API を作成する

PHPz
PHPzオリジナル
2024-07-29 13:53:53855ブラウズ

Create a CRUD API with Go

CRUD 操作 (作成、読み取り、更新、削除) は、データベースを操作する場合の Web アプリケーションの基本機能です。この例では、Go と MySQL をデータベースとして使用して CRUD API を作成する方法を示します。

前提条件

  • Go 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=

db.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
}

ルーター.ゴー

このファイルは、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
}

product_controller.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>
  • 他の多くの記事では API をテストするための HTTP クライアントとして Postman を使用しますが、この記事では代わりに JavaScript を使用します。これは、クライアント側で HTTP リクエストを操作するときに、より詳細を理解するのに役立ちます。
  • このファイルをクリーンで読みやすい状態に保つために、基本的な HTML と JavaScript のみを使用します。ここには CSS フレームワークや Axios などの追加ライブラリはありません。
  • すべての CRUD 関数は、適切な HTTP メソッドを使用して API を呼び出します。
  • showResponse(res) は、JSON オブジェクトを読みやすくフォーマットします。

プロジェクトの実行

go run main.go

Web ブラウザを開いて http://localhost:8080 に移動します

テスト

すべての製品を入手

「製品を入手」ボタンをクリックします。 API はすべての商品データを返します。

Create a CRUD API with Go

IDで製品を取得

「製品を取得」ボタンをクリックし、製品 ID に「1」を入力します。 API は商品データを返します。

Create a CRUD API with Go

製品の作成

「製品の作成」ボタンをクリックし、製品名に「test-create」、価格に「100」と入力します。 API は新しく作成された製品を返します。

Create a CRUD API with Go

製品を更新する

「製品の更新」ボタンをクリックし、製品 ID に「101」、名前に「test-update」、価格に「200」を入力します。 API は更新された製品を返します。

Create a CRUD API with Go

製品の削除

「製品を削除」ボタンをクリックし、製品 ID に「101」を入力します。 API は何も返しませんが、API からは何も返さないため、これは許容されます。

Create a CRUD API with Go

結論

この記事では、CRUD API を作成するために、Gin フレームワークを作成および設定する方法を学習しました。 GORM を ORM として利用して、データベースに対して CRUD 操作を実行します。 JavaScript を使用して API をテストします。記事をお楽しみいただければ幸いです。

ソースコード: https://github.com/StackPuz/Example-CRUD-Go

CRUD Web アプリを作成します: https://stackpuz.com

以上がGo で CRUD API を作成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。