Rumah  >  Artikel  >  pembangunan bahagian belakang  >  golang melaksanakan rangka kerja web

golang melaksanakan rangka kerja web

王林
王林asal
2023-05-12 22:42:08947semak imbas

Golang ialah bahasa pengaturcaraan yang sangat popular yang digemari oleh ramai pengaturcara kerana kecekapannya dan sokongan serentak yang berkuasa. Dalam bidang pembangunan web, aplikasi web berprestasi tinggi dan berskala tinggi boleh dibina dengan menggunakan Golang. Untuk membina aplikasi web dengan lebih mudah, pembangun biasanya menggunakan rangka kerja web Golang. Dalam artikel ini, kita akan membincangkan cara melaksanakan rangka kerja web mudah menggunakan Golang.

Melaksanakan rangka kerja web perlu menangani isu yang sangat penting: cara mengendalikan permintaan dan respons HTTP. Golang menyediakan perpustakaan standard yang sangat mudah untuk menangani masalah ini, pakej net/http. Memandangkan kami ingin mencipta rangka kerja, kami akan menggunakan perpustakaan standard ini untuk melaksanakan aplikasi web kami.

Pertama, kita perlu menentukan fungsi rangka kerja web kita. Kami ingin mencipta penghala ringkas yang boleh memetakan laluan URL yang diminta oleh pengguna kepada fungsi pengendali yang sepadan. Kami juga mahu menyokong perisian tengah untuk mengendalikan permintaan dan respons HTTP.

Sebelum mencipta rangka kerja web kami, kami terlebih dahulu perlu memahami beberapa konsep dan perpustakaan Golang yang biasa. Yang pertama ialah struktur (struct), iaitu jenis data yang ditentukan pengguna yang boleh digunakan untuk menyimpan satu set atribut berkaitan. Seterusnya datang fungsi, yang merupakan blok boleh laku kod yang menerima parameter dan mengembalikan nilai. Dalam Golang, fungsi juga boleh digunakan sebagai pembolehubah. Akhir sekali, terdapat antara muka, yang mentakrifkan satu set kaedah Sebarang jenis yang melaksanakan kaedah ini boleh dianggap sebagai melaksanakan antara muka. Antara muka boleh digunakan untuk memisahkan kod dan menjadikannya lebih fleksibel.

Dengan mengambil kira konsep asas ini, kami boleh mula membina rangka kerja web kami. Yang pertama ialah fungsi penghala. Kita boleh melaksanakan penghala dengan mencipta struktur Penghala. Struktur Penghala ini harus mempunyai fungsi berikut:

  • Dapat memetakan permintaan kepada fungsi pemprosesan yang sepadan berdasarkan laluan URL dan kaedah HTTP (GET, POST, dll.).
  • Dapat mengendalikan parameter dan mengembalikan nilai fungsi pengendali dan membungkusnya ke dalam http.HandlerFunc.
  • Perisian tengah yang mengendalikan penghala dan menggunakannya pada permintaan dan respons HTTP.

Berikut ialah struktur Penghala mudah yang boleh mencapai fungsi di atas:

type Router struct {
    routes       map[string]map[string]http.HandlerFunc
    middleware   []Middleware
}

Dalam struktur ini, kami menggunakan peta bersarang untuk menyimpan penghalaan dan pemetaan fungsi pemprosesan antara. Kami boleh melaksanakan pemetaan dengan mudah dengan mempunyai laluan URL dan kaedah HTTP sebagai kunci peringkat pertama dan kedua. Harta middleware ialah tatasusunan Middleware yang menyimpan middleware yang digunakan pada permintaan dan respons HTTP.

Seterusnya, kita perlu melaksanakan kaedah untuk menambah penghalaan dan pemetaan fungsi pemprosesan:

func (router *Router) HandleFunc(method string, path string, handlerFunc http.HandlerFunc) {
    if _, ok := router.routes[method]; !ok {
        router.routes[method] = make(map[string]http.HandlerFunc)
    }
    router.routes[method][path] = handlerFunc
}

Kaedah ini membungkus kaedah HTTP, laluan URL dan fungsi pemprosesan ke dalam jenis fungsi pemprosesan, dan Ia adalah ditambahkan pada jadual pemetaan penghala. Jika pemetaan belum dibuat untuk kaedah HTTP ini, kita perlu mencipta entri baharu dalam jadual pemetaan.

Seterusnya, kami perlu melaksanakan kaedah lain untuk mengendalikan permintaan dan respons HTTP. Kaedah ini perlu menyemak laluan URL yang diminta dan kaedah HTTP dan memetakannya ke fungsi pengendali yang sepadan. Jika pengendali yang sepadan tidak dijumpai, ralat 404 harus dikembalikan. Jika middleware wujud, ia harus dikendalikan. Akhirnya, fungsi pengendali dipanggil dan permintaan dan tindak balas diluluskan sebagai parameter.

func (router *Router) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    var handlerFunc http.HandlerFunc
    var exists bool

    if handlerFunc, exists = router.routes[r.Method][r.URL.Path]; !exists {
        http.NotFound(w, r)
        return
    }

    for _, middleware := range router.middleware {
        handlerFunc = middleware(handlerFunc)
    }

    handlerFunc(w, r)
}

Kaedah ini menggunakan antara muka terbina dalam bahasa Go http.Handler untuk mengendalikan permintaan dan respons HTTP. Pustaka HTTP secara automatik menukarnya kepada http.ResponseWriter dan http.Request. Kami hanya perlu mengendalikannya seperti yang ditunjukkan dalam kod.

Akhir sekali, kita perlu melaksanakan kaedah untuk menambah perisian tengah. Kaedah ini akan membungkus lagi fungsi pengendali HTTP dan menggunakannya pada permintaan dan respons HTTP.

func (router *Router) Use(middleware Middleware) {
    router.middleware = append(router.middleware, middleware)
}

Kini, kami telah berjaya mencipta rangka kerja web asas Golang. Kod lengkap adalah seperti berikut:

package main

import (
    "net/http"
)

type Middleware func(http.HandlerFunc) http.HandlerFunc

type Router struct {
    routes       map[string]map[string]http.HandlerFunc
    middleware   []Middleware
}

func NewRouter() *Router {
    return &Router{
        routes: make(map[string]map[string]http.HandlerFunc),
        middleware: []Middleware{},
    }
}

func (router *Router) HandleFunc(method string, path string, handlerFunc http.HandlerFunc) {
    if _, ok := router.routes[method]; !ok {
        router.routes[method] = make(map[string]http.HandlerFunc)
    }
    router.routes[method][path] = handlerFunc
}

func (router *Router) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    var handlerFunc http.HandlerFunc
    var exists bool

    if handlerFunc, exists = router.routes[r.Method][r.URL.Path]; !exists {
        http.NotFound(w, r)
        return
    }

    for _, middleware := range router.middleware {
        handlerFunc = middleware(handlerFunc)
    }

    handlerFunc(w, r)
}

func (router *Router) Use(middleware Middleware) {
    router.middleware = append(router.middleware, middleware)
}

func main() {
    router := NewRouter()

    router.HandleFunc(http.MethodGet, "/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello, world!"))
    })

    router.Use(func(next http.HandlerFunc) http.HandlerFunc {
        return func(w http.ResponseWriter, r *http.Request) {
            w.Header().Set("Content-Type", "application/json")
            next(w, r)
        }
    })

    http.ListenAndServe(":8000", router)
}

Dalam kod ini, kami mula-mula mencipta fungsi yang dipanggil NewRouter untuk mencipta tika Router baharu. Seterusnya, kami menggunakan kaedah HandleFunc untuk menambah pemetaan fungsi penghalaan dan pemprosesan yang sepadan. Kemudian, tambah perisian tengah melalui kaedah Use. Akhir sekali, kami menggunakan fungsi ListenAndServe untuk memulakan pelayan HTTP.

Untuk menguji rangka kerja web kami, kami boleh menjalankan kod di atas dan kemudian masukkan alamat "localhost:8000" dalam penyemak imbas. Jika semuanya berjalan lancar, anda seharusnya melihat "Helo, dunia!" dan pengepala respons harus mengandungi atribut "Content-Type: application/json".

Dalam artikel ini, kami memperkenalkan cara menggunakan Golang untuk melaksanakan rangka kerja web dan menunjukkan kod sampel mudah. Walaupun rangka kerja contoh kami adalah sangat asas, kami boleh melanjutkannya dengan menambahkan lebih banyak ciri dan perisian tengah. Saya harap anda boleh belajar cara membina rangka kerja web anda sendiri di Golang melalui artikel ini.

Atas ialah kandungan terperinci golang melaksanakan rangka kerja web. 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
Artikel sebelumnya:Adakah golang menyokong lengan?Artikel seterusnya:Adakah golang menyokong lengan?