ホームページ  >  記事  >  バックエンド開発  >  Gorilla Mux のリクエスト ハンドラーに引数を渡すにはどうすればよいですか?

Gorilla Mux のリクエスト ハンドラーに引数を渡すにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-17 06:22:03575ブラウズ

How can I pass arguments to request handlers in Gorilla Mux?

リクエスト ハンドラーに引数を渡す

Gorilla Mux を使用する場合、多くの開発者は引数をハンドラーに直接渡すという制限に遭遇します。 HandleFunc メソッドは 2 番目のパラメータとしてクロージャのみを受け入れます。これにより、ハンドラに渡すことができるパラメータの数が制限されます。

Globally Accessible Database Object

1 つの共通解決策は、グローバルにアクセス可能なデータベース オブジェクトを使用することです。このアプローチは多くの場合許容されますが、保守性やテスト容易性への懸念など、さまざまな理由からグローバル変数を避けることを好む開発者もいます。

ミドルウェア

ミドルウェアは、次のことを可能にするメカニズムです。開発者は、リクエストがハンドラーに到達する前にインターセプトして処理できるようになります。考えられる回避策は、データベース オブジェクトをリクエスト コンテキストに追加するミドルウェア関数を作成することです。このミドルウェアを使用してデータベースをハンドラーに挿入できます。

例:

package main

import (
    "fmt"
    "net/http"

    "github.com/gorilla/mux"
    "gorm.io/gorm"
)

func main() {
    db := createDB()

    mux := mux.NewRouter()
    mux.Use(func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            // Add the database object to the request context
            r.Context() = context.WithValue(r.Context(), "db", db)
            // Pass the request to the next handler
            next.ServeHTTP(w, r)
        })
    })

    mux.HandleFunc("/users/{id}", showUserHandler).Methods("GET")
}

func showUserHandler(w http.ResponseWriter, r *http.Request) {
    // Retrieve the database object from the request context
    db := r.Context().Value("db").(*gorm.DB)

    fmt.Fprintf(w, "We should fetch the user with id %s", mux.Vars(r)["id"])
}

ラッパー関数

別の回避策は次のとおりです。追加のパラメータを受け入れるラッパー関数を作成します。例:

db := createDB()

mux := mux.NewRouter()
mux.HandleFunc("/users/{id}", func(w http.ResponseWriter, r *http.Request) {
    showUserHandler(w, r, db)
}).Methods("GET")

結論

Gorilla Mux のリクエスト ハンドラーに引数を渡すには、ミドルウェアの使用やラッパー関数の作成など、いくつかの方法があります。最適なアプローチは、開発者の特定の要件と好みによって異なります。

以上がGorilla Mux のリクエスト ハンドラーに引数を渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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