首頁 > 後端開發 > Golang > Go 路由:使用 net/http 處理和分組路由

Go 路由:使用 net/http 處理和分組路由

Barbara Streisand
發布: 2024-11-03 05:15:02
原創
807 人瀏覽過

Go Routing : Handling and Grouping Routes with net/http

Go 1.22 為 net/http 套件的路由器帶來了兩個增強:方法匹配和通配符。這些功能可讓您將常見的路由表達為模式而不是 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 未找到回應
例:

  • 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)) 這會使用 /users/ 的基本 URL 註冊使用者。 StripPrefix 在將請求 URL 路由至 userRouter 之前刪除指定的前綴。
// 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 內建路由功能的同時維護可擴展程式碼是多麼容易。 」聊天GPT

現在我們已經成功地對使用者路線進行了分組。克隆存儲庫並嘗試添加另一個服務。

以上是Go 路由:使用 net/http 處理和分組路由的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板