スキップしてメイン コンテンツに移動

GinでHTTPメソッド入門

GinでHTTPメソッド入門

Gin初心者のためのルーティング入門

Go言語でWebアプリを構築する際に人気のフレームワーク、Ginはシンプルなルーティング機能を提供します。Ginのルーティングは r.GETr.POST などのメソッドで定義し、URLパスとハンドラ関数を結びつけます。例えば、/hello というエンドポイントにアクセスしたときに「Hello, World!」と返すだけの簡単な例を見てみましょう。

package main

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

func main() {
    r := gin.Default()
    r.GET("/hello", func(c *gin.Context) {
        c.String(200, "Hello, World!")
    })
    r.Run() // デフォルトで :8080 で起動
}

上記のコードでは r.GET を使って GET リクエストを受け取るエンドポイントを作成しています。Ginはルーティングを高速に処理し、ミドルウェアやパラメータ抽出も簡単に行えます。

HTTPメソッドとエンドポイントの使い分け

Web APIを設計する際に重要なのは、HTTPメソッド(GET, POST, PUT, DELETE など)とエンドポイントの関係です。以下に代表的な組み合わせを示します。

  • GET /users - ユーザー一覧を取得
  • POST /users - 新規ユーザーを作成
  • GET /users/:id - 特定ユーザーの詳細を取得
  • PUT /users/:id - ユーザー情報を更新
  • DELETE /users/:id - ユーザーを削除

Ginでは r.GETr.POST などを使って上記のようにメソッドごとにルーティングを定義します。エンドポイントはリソースを表すURLで、パラメータは : を使って動的に取得できます。

実践例: r.GET, r.POST, r.PUT, r.DELETE

以下に、ユーザー管理APIの簡易実装例を示します。GinのルーティングとHTTPメソッドを組み合わせて、CRUD操作を実現します。

package main

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

type User struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

var users = []User{
    {ID: 1, Name: "Alice"},
    {ID: 2, Name: "Bob"},
}

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

    // GET /users
    r.GET("/users", func(c *gin.Context) {
        c.JSON(http.StatusOK, users)
    })

    // POST /users
    r.POST("/users", func(c *gin.Context) {
        var newUser User
        if err := c.ShouldBindJSON(&newUser); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }
        newUser.ID = len(users) + 1
        users = append(users, newUser)
        c.JSON(http.StatusCreated, newUser)
    })

    // GET /users/:id
    r.GET("/users/:id", func(c *gin.Context) {
        id := c.Param("id")
        for _, u := range users {
            if fmt.Sprintf("%d", u.ID) == id {
                c.JSON(http.StatusOK, u)
                return
            }
        }
        c.JSON(http.StatusNotFound, gin.H{"error": "user not found"})
    })

    // PUT /users/:id
    r.PUT("/users/:id", func(c *gin.Context) {
        id := c.Param("id")
        var updated User
        if err := c.ShouldBindJSON(&updated); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }
        for i, u := range users {
            if fmt.Sprintf("%d", u.ID) == id {
                users[i].Name = updated.Name
                c.JSON(http.StatusOK, users[i])
                return
            }
        }
        c.JSON(http.StatusNotFound, gin.H{"error": "user not found"})
    })

    // DELETE /users/:id
    r.DELETE("/users/:id", func(c *gin.Context) {
        id := c.Param("id")
        for i, u := range users {
            if fmt.Sprintf("%d", u.ID) == id {
                users = append(users[:i], users[i+1:]...)
                c.Status(http.StatusNoContent)
                return
            }
        }
        c.JSON(http.StatusNotFound, gin.H{"error": "user not found"})
    })

    r.Run()
}

この例では、Ginの r.GETr.POSTr.PUTr.DELETE を使って、ユーザーリソースに対する CRUD 操作を実装しています。エンドポイントは /users/users/:id を使い、HTTPメソッドで操作を区別しています。Gin初心者でも直感的にルーティングを定義できる点が魅力です。

この記事はAIによって作成されました。

コメント