戻る

GoとGinによるRESTful APIの構築

ニキータ・ハビャ

ニキータ・ハビャ

8分間の読み物

|

4 month前

ジン、君が思ってるやつじゃないぞ!

Ginは高速かつ効率的な人気のGoフレームワークであり、スケーラブルなWebアプリケーション構築に最適です。シンプルで使いやすく、コードが魔法のように見えずに明快です。

Ginについて 🍸

Gin特有の機能~

Ginで最初のサーバーを作成する 🚀

1. プロジェクトの設定

メモリに保存されたToDoリストを管理するRESTful APIを構築します。APIは以下のエンドポイントをサポートします:

さあ、始めましょう!

コードを書く前に、システムにGoがインストールされていることを確認してください。 プロジェクトの新しいディレクトリを作成し、Goモジュールを初期化し、Ginパッケージをインストールします。

bash
~ $ mkdir todo-api

~ $ cd todo-api

~/todo-api $ go mod init todo-api

~/todo-api $ go get github.com/gin-gonic/gin

これにより、todo-apiという名前のGoモジュールが設定され、Ginフレームワークがインストールされます。

2. ジンを起動して動作させる

設定をテストするための最小限のGinサーバーから始めましょう。main.goという名前のファイルを作成します:

go
package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func main() {
    router := gin.Default()

    router.GET("/todos", func(c *gin.Context) {
        c.IndentedJSON(http.StatusOK, gin.H{"message": "Hello, World!"})
    })

    router.Run("localhost:8080") // ローカルでポート8080のサーバーを起動します
}

サーバーを次のコマンドで実行します:

bash
~/todo-api $ go run main.go

ブラウザを開き、http://localhost:8080 に移動します。次の出力が表示されるはずです:

json
{
    "message": "Hello, World!"
}

これでGinが正しく設定されたことが確認できます!

gin.Default()関数は、ロギングとリカバリミドルウェアを装備したルーターを初期化します。router.run()はサーバーを起動します。

3. Todoモデルとインメモリストアを定義する

go
package main

import (
    "errors"
    "net/http"
    "strings"
    "github.com/gin-gonic/gin"
)

// Todo はTodoアイテムを表します
type Todo struct {
    ID        string `json:"id"`
    Item      string `json:"item"`
    Completed bool   `json:"completed"`
}

// Todoのインメモリストア
var TODOS = []Todo{
    {ID: "1", Item: "Goを学ぶ", Completed: false},
    {ID: "2", Item: "APIを構築する", Completed: false},
}

Todo構造体は、フィールドをJSONキーにマッピングするためにJSONタグを使用します。

4. 補助関数

  1. 大文字小文字を区別しない文字列検索: この関数は、大文字小文字を区別せずに、str内にsubstrが含まれているかどうかをチェックします。
go
// 大文字小文字を区別せずに文字列が含まれているかをチェック
func containsIgnoreCase(str, substr string) bool {
    return strings.Contains(strings.ToLower(str), strings.ToLower(substr))
}
  1. IDによるTodoの取得: この関数は、指定されたIDを持つTodoをTODOSスライスから検索します。
go
// IDでTodoを検索
func getTodoById(id string) (*Todo, error) {
    for i := range TODOS {
        if TODOS[i].ID == id {
            return &TODOS[i], nil
        }
    }
    return nil, errors.New("todoが見つかりません")
}

5. APIエンドポイントの記述

5.1 GET /todos

このエンドポイントは、クエリ(検索語句)またはステータス(完了済みかどうか)によるオプションのフィルタリングを伴い、すべてのToDoを取得します。

go
func getTodos(context *gin.Context) {
    var filtered []Todo
    
    // クエリパラメータによるフィルタリングロジックをここに記述

    context.IndentedJSON(http.StatusOK, filtered)
}

getTodos()関数は、TODOSスライスからすべてのTodoを取得し、JSONレスポンスとして返します。クエリやステータスに基づいてTodoを取得するには、クエリパラメータに基づいてTodoをフィルタリングするロジックを追加できます。完全なコードで実装されているを参照してください。

5.2 GET /todos/:id

このエンドポイントは、IDによって特定のToDoを取得します。

go
func getTodo(context *gin.Context) {
    id := context.Param("id")
    todo, err := getTodoById(id)

    if err != nil {
        context.IndentedJSON(http.StatusNotFound, gin.H{"message": "Todoが見つかりません"})
        return
    }

    context.IndentedJSON(http.StatusOK, todo)
}

5.3 POST /todos

このエンドポイントは、メモリ内リストに新しいToDoを作成します。

go
func addTodo(context *gin.Context) {
    var newTodo Todo

    if err := context.BindJSON(&newTodo); err != nil {
        context.IndentedJSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    TODOS = append(TODOS, newTodo)

    context.IndentedJSON(http.StatusCreated, newTodo)
}

curlでテストする

bash
curl -X POST http://localhost:8080/todos -H "Content-Type: application/json" -d '{"id":"3","item":"Test API","completed":false}'

更新および削除エンドポイントを確認するには、完全なコードを参照してください。

リクエスト処理 - 舞台裏 🎬

リクエスト処理

まとめ: