Go 1.22 では、net/http パッケージのルーターにメソッド マッチングとワイルドカードという 2 つの機能強化が加えられています。これらの機能により、一般的なルートを Go コードではなくパターンとして表現できます。説明も使用も簡単ですが、複数のリクエストが一致した場合に勝ちパターンを選択するための適切なルールを考え出すのは困難でした。
Go 1.22 では、net/http パッケージに新機能が追加され、サードパーティ ライブラリの使用に代わる優れた代替手段となりました。この記事では、Golang の net/http パッケージを使用してルーティングを処理する方法を見ていきます。基本的なルート処理から始めて、それらのルートのグループ化に進みます。
メモ
まず、ルートを登録する方法を見てみましょう。
// 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) }
上記のコードを見てみましょう:
注: リクエストを行うときは、末尾にスラッシュを必ず追加してください。それ以外の場合は、404 not found 応答が返されます
例:
サンプルリクエスト:
// 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 } // ...
コードを見てみましょう。
// 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 メソッドに焦点を当てます。
// 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 サイトの他の関連記事を参照してください。