ホームページ > バックエンド開発 > Golang > Go Routing : net/http を使用したルートの処理とグループ化

Go Routing : net/http を使用したルートの処理とグループ化

Barbara Streisand
リリース: 2024-11-03 05:15:02
オリジナル
800 人が閲覧しました

Go Routing : Handling and Grouping Routes with net/http

Go 1.22 では、net/http パッケージのルーターにメソッド マッチングとワイルドカードという 2 つの機能強化が加えられています。これらの機能により、一般的なルートを Go コードではなくパターンとして表現できます。説明も使用も簡単ですが、複数のリクエストが一致した場合に勝ちパターンを選択するための適切なルールを考え出すのは困難でした。

Go 1.22 では、net/http パッケージに新機能が追加され、サードパーティ ライブラリの使用に代わる優れた代替手段となりました。この記事では、Golang の net/http パッケージを使用してルーティングを処理する方法を見ていきます。基本的なルート処理から始めて、それらのルートのグループ化に進みます。

メモ

  • これは、Go バージョン >= 1.22 を使用していることを前提としています
  • 詳細についてはリポジトリ

基本的なルーティング

まず、ルートを登録する方法を見てみましょう。

// main.go
package main

import (
    "log"
    "net/http"
)

func main() {
    router := http.NewServeMux()

    router.HandleFunc("GET /users/", getUsers)
    router.HandleFunc("POST /users/", createUser)
    router.HandleFunc("GET /users/{id}/", getUser)
    router.HandleFunc("DELETE /users/{id}/", deleteUser)

    err := http.ListenAndServe(":8000", router)
    if err != nil {
        log.Fatal(err)
    }
}

// Here goes the implementation for getUsers, getUser, createUser, deleteUser
// Check the repo in services/users/routes.go

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

var users []User = []User{
    {ID: 1, Name: "Bumblebee", Email: "bumblebee@autobots.com"},
    {ID: 2, Name: "Optimus Prime", Email: "optimus.prime@autobots.com"},
    {ID: 3, Name: "Ironhide", Email: "ironhide@autobots.com"},
    {ID: 4, Name: "Hot Rod", Email: "hot.rod@autobots.com"},
}

func getUsers(w http.ResponseWriter, r *http.Request) {
    response := map[string]any{
        "message": "Done",
        "users":   users,
    }
    utils.WriteJSONResponse(w, http.StatusOK, response)
}
ログイン後にコピー
ログイン後にコピー

上記のコードを見てみましょう:

  1. router := http.NewServeMux() これにより、新しいリクエスト マルチプレクサが作成されます。リクエストが行われると、ルーターはリクエストの URL を調べ、リクエストを処理するために最も適切なハンドラーを選択します。
  2. router.HandleFunc("GET /users/", getUsers) これは /users/ ルートを登録し、これが GET メソッドのルートであることを示します。
  3. utils.WriteJSONResponse これは JSON 応答を作成するユーティリティ関数で、utils/utils.go のリポジトリにあります。

注: リクエストを行うときは、末尾にスラッシュを必ず追加してください。それ以外の場合は、404 not found 応答が返されます
例:

  • http://localhost:8000/users は 404
  • を返します
  • http://localhost:8000/users/ は正しいサーバー応答を返します

サンプルリクエスト:

  • リクエスト: GET http://localhost:8000/users/
  • 応答:
// statusCode: 200
{
    "message": "Done",
    "users": [
        {
            "id": 1,
            "name": "Bumblebee",
            "email": "bumblebee@autobots.com"
        },
        {
            "id": 2,
            "name": "Optimus Prime",
            "email": "optimus.prime@autobots.com"
        },
        {
            "id": 3,
            "name": "Ironhide",
            "email": "ironhide@autobots.com"
        },
        {
            "id": 4,
            "name": "Hot Rod",
            "email": "hot.rod@autobots.com"
        }
    ]
}
ログイン後にコピー
ログイン後にコピー

ルートのグループ化

上記からわかるように、これにはすべてのエンドポイントを同じ場所に登録する必要があり、すぐに手に負えなくなる可能性があります。ルートをグループ化すると、関連するルートとロジックをまとめることにより、コードを整理し、スケーラブルで、保守しやすくすることができます。これにより、特にアプリケーションの成長に応じて、ミドルウェアを選択的に適用し、再利用性が促進され、可読性が向上します。
次に、ルートをグループ化する方法を見てみましょう

まず、ハンドラー関数が定義されているパッケージ内でルートをローカルに登録します。次のステップは、これらのさまざまなルートをすべてまとめてサーバーを起動することです。

// services/users/routes.go
package user

import (
    "fmt"
    "net/http"
    "strconv"

    "<your-project-name>/gorouting/utils"
)

type Handler struct{}

func NewHandler() *Handler {
    return &Handler{}
}

func (h *Handler) RegisterRoutes() *http.ServeMux {
    r := http.NewServeMux()
    r.HandleFunc("GET /", getUsers)
    r.HandleFunc("POST /", createUser)

    r.HandleFunc("GET /{id}/", getUser)
    r.HandleFunc("DELETE /{id}/", deleteUser)

    return r
}
// ...
ログイン後にコピー

コードを見てみましょう。

  1. func NewHandler() *Handler これにより、データベースへのアクセス権が存在する場合に追加するなど、依存関係の注入に使用される新しいハンドラーが作成されます。
  2. func (h *Handler) RegisterRoutes() *http.ServeMux ここでは、新しい ServeMux を作成し、ルートを登録します。
// main.go
package main

import (
    "log"
    "net/http"
)

func main() {
    router := http.NewServeMux()

    router.HandleFunc("GET /users/", getUsers)
    router.HandleFunc("POST /users/", createUser)
    router.HandleFunc("GET /users/{id}/", getUser)
    router.HandleFunc("DELETE /users/{id}/", deleteUser)

    err := http.ListenAndServe(":8000", router)
    if err != nil {
        log.Fatal(err)
    }
}

// Here goes the implementation for getUsers, getUser, createUser, deleteUser
// Check the repo in services/users/routes.go

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

var users []User = []User{
    {ID: 1, Name: "Bumblebee", Email: "bumblebee@autobots.com"},
    {ID: 2, Name: "Optimus Prime", Email: "optimus.prime@autobots.com"},
    {ID: 3, Name: "Ironhide", Email: "ironhide@autobots.com"},
    {ID: 4, Name: "Hot Rod", Email: "hot.rod@autobots.com"},
}

func getUsers(w http.ResponseWriter, r *http.Request) {
    response := map[string]any{
        "message": "Done",
        "users":   users,
    }
    utils.WriteJSONResponse(w, http.StatusOK, response)
}
ログイン後にコピー
ログイン後にコピー

ここでは、Run メソッドに焦点を当てます。

  1. userHandler := user.NewHandler() これにより、新しいハンドラーが作成され、データベース接続などを必要とするエンドポイントに渡すことができるポイントになります。これは依存性注入と呼ばれます。
  2. userRouter := userHandler.RegisterRoutes() これにより、ユーザー ルートを含む ServeMux が作成されます。
  3. router.Handle("/api/v1/users/", http.StripPrefix("/api/v1/users", userRouter)) これにより、ベース URL /users/ でユーザーが登録されます。 StripPrefix は、リクエスト URL を userRouter にルーティングする前に、リクエスト URL から指定されたプレフィックスを削除します。
// statusCode: 200
{
    "message": "Done",
    "users": [
        {
            "id": 1,
            "name": "Bumblebee",
            "email": "bumblebee@autobots.com"
        },
        {
            "id": 2,
            "name": "Optimus Prime",
            "email": "optimus.prime@autobots.com"
        },
        {
            "id": 3,
            "name": "Ironhide",
            "email": "ironhide@autobots.com"
        },
        {
            "id": 4,
            "name": "Hot Rod",
            "email": "hot.rod@autobots.com"
        }
    ]
}
ログイン後にコピー
ログイン後にコピー

「Go 1.22 では、net/http はより多用途になり、明確さと効率を向上させるルート パターンを提供します。ルートをグループ化するこのアプローチは、Go の組み込みルーティング機能を利用しながら、スケーラブルなコードを維持することがいかに簡単であるかを示しています。」 ChatGPT

これで、ユーザールートをグループ化することができました。リポジトリのクローンを作成し、別のサービスを追加してみてください。

以上がGo Routing : net/http を使用したルートの処理とグループ化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート