Rumah >pembangunan bahagian belakang >Golang >Go Routing : Mengendalikan dan Mengumpulkan Laluan dengan net/http

Go Routing : Mengendalikan dan Mengumpulkan Laluan dengan net/http

Barbara Streisand
Barbara Streisandasal
2024-11-03 05:15:02808semak imbas

Go Routing : Handling and Grouping Routes with net/http

Go 1.22 membawa dua peningkatan pada penghala pakej net/http: padanan kaedah dan kad bebas. Ciri ini membolehkan anda menyatakan laluan biasa sebagai corak dan bukannya kod Go. Walaupun ia mudah untuk dijelaskan dan digunakan, adalah satu cabaran untuk menghasilkan peraturan yang betul untuk memilih corak kemenangan apabila beberapa sepadan dengan permintaan.

Go 1.22 menambah ciri baharu pada pakej net/http mereka untuk menjadikannya alternatif yang baik untuk menggunakan perpustakaan pihak ketiga. Dalam artikel ini, kita akan melihat cara mengendalikan penghalaan menggunakan pakej net/http Golang. Kami akan bermula dengan pengendalian laluan asas dan kemudian meneruskan kepada mengumpulkan laluan tersebut.

Nota

  • Ini mengandaikan anda menggunakan versi Go >= 1.22
  • Repo untuk butiran lanjut

Penghalaan Asas

Mari kita mulakan dengan melihat cara mendaftar laluan anda.

// 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)
}

Jom baca kod di atas:

  1. penghala := http.NewServeMux() Ini mencipta pemultipleks permintaan baharu. Apabila permintaan dibuat, penghala memeriksa URL permintaan dan memilih pengendali yang paling sesuai untuk menyampaikan permintaan tersebut.
  2. router.HandleFunc("GET /users/", getUsers) Ini mendaftarkan laluan /users/ dan menunjukkan bahawa ini akan menjadi laluan kaedah GET.
  3. utils.WriteJSONResponse Ini ialah fungsi utiliti untuk mencipta respons JSON dan boleh didapati dalam repo dalam utils/utils.go

Nota: Semasa membuat permintaan pastikan anda menambah garis miring. Tindakan sebaliknya akan mengembalikan respons 404 tidak ditemui
Contoh:

  • http://localhost:8000/users mengembalikan 404
  • http://localhost:8000/users/ mengembalikan respons pelayan yang betul

Permintaan Contoh:

  • Permintaan: DAPATKAN http://localhost:8000/users/
  • Jawapan:
// 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"
        }
    ]
}

Laluan Kumpulan

Seperti yang dapat kita lihat daripada di atas, ini memerlukan kita mendaftarkan semua titik akhir di tempat yang sama dan boleh hilang kawalan dengan cepat. Pengumpulan laluan membantu anda memastikan kod anda teratur, berskala dan boleh diselenggara dengan menggabungkan laluan dan logik yang berkaitan. Ia membolehkan anda menggunakan perisian tengah secara selektif, menggalakkan kebolehgunaan semula dan meningkatkan kebolehbacaan, terutamanya apabila aplikasi anda berkembang.
Sekarang mari kita lihat bagaimana kita boleh mengumpulkan laluan

Kami akan mulakan dengan mendaftarkan laluan secara tempatan dalam pakej di mana fungsi pengendalinya ditentukan. Langkah seterusnya ialah menyatukan semua laluan tersebut dan mulakan pelayan.

// 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
}
// ...

Mari kita lihat kod tersebut.

  1. func NewHandler() *Handler Ini mencipta Pengendali baharu yang digunakan untuk suntikan pergantungan seperti menambah akses kepada pangkalan data sekiranya ada.
  2. func (h *Handler) RegisterRoutes() *http.ServeMux Di sini kami mencipta ServeMux baharu dan mendaftar laluan.
// 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)
}

Di sini kita akan menumpukan pada kaedah Larian.

  1. userHandler := user.NewHandler() Ini mencipta pengendali baharu dan ini adalah titik di mana perkara seperti sambungan pangkalan data boleh dihantar bersama ke titik akhir yang memerlukannya. Ini dipanggil suntikan pergantungan.
  2. userRouter := userHandler.RegisterRoutes() Ini mencipta ServeMux yang mengandungi laluan pengguna.
  3. router.Handle("/api/v1/users/", http.StripPrefix("/api/v1/users", userRouter)) Ini mendaftarkan pengguna dengan URL asas /users/. StripPrefix mengalih keluar awalan yang ditentukan daripada URL permintaan sebelum menghalakannya ke 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"
        }
    ]
}

“Dengan Go 1.22, net/http kini lebih serba boleh, menawarkan corak laluan yang meningkatkan kejelasan dan kecekapan. Pendekatan untuk mengumpulkan laluan ini menunjukkan betapa mudahnya untuk mengekalkan kod berskala sambil memanfaatkan keupayaan penghalaan terbina dalam Go." SembangGPT

Sekarang kami telah berjaya mengumpulkan laluan pengguna. Klon repo dan cuba tambah perkhidmatan lain.

Atas ialah kandungan terperinci Go Routing : Mengendalikan dan Mengumpulkan Laluan dengan net/http. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn