Jadual Kandungan
Kandungan soalan
Penyelesaian
dan
Pembungkusan
Rumah pembangunan bahagian belakang Golang Pengepala versi berasaskan golang

Pengepala versi berasaskan golang

Feb 10, 2024 pm 07:03 PM
overflow

golang 上基于标头的版本控制

Kawalan versi berasaskan pengepala pada Golang ialah cara yang cekap untuk mengurus versi kod semasa pembangunan. Dengan menambahkan maklumat versi pada permulaan fail kod, pembangun boleh menjejaki perubahan kod dan sejarah versi dengan mudah. Kaedah kawalan versi ini bukan sahaja mudah digunakan, tetapi juga sesuai untuk projek semua saiz. Editor PHP Xigua akan memperkenalkan secara terperinci penggunaan dan langkah berjaga-jaga bagi kawalan versi berasaskan pengepala pada Golang dalam artikel ini untuk membantu pembangun mengurus dan mengekalkan kod dengan lebih baik. Sama ada anda seorang pemula atau pembangun berpengalaman, artikel ini akan memberi anda rujukan dan panduan yang berharga. Mari kita terokai teknologi kawalan versi yang menarik dan praktikal ini bersama-sama!

Kandungan soalan

Saya mahu menggunakan gin untuk melaksanakan kawalan versi berasaskan pengepala semasa dalam perjalanan. Saya sedang berfikir untuk menggunakan fungsi middleware untuk melakukan ini pada penghala.

Pelanggan akan memanggil url api yang sama dan versi akan berada dalam pengepala http tersuai seperti ini:

Panggil versi 1 Dapatkan /users/12345678 Versi yang diterima: v1

Panggil versi 2: Dapatkan /users/12345678 Versi yang diterima: v2

Jadi penghala boleh mengecam pengepala dan memanggil versi tertentu. Perkara seperti ini:

router := gin.Default()

            v1 := router.Group("/v1")
            v1.Use(VersionMiddleware())
            v1.GET("/user/:id", func(c *gin.Context) {
                c.String(http.StatusOK, "This is the v1 API")
            })

            v2 := router.Group("/v2")
            v2.Use(VersionMiddleware())
            v2.GET("/user/:id", func(c *gin.Context) {
                c.String(http.StatusOK, "This is the v2 API")
            })

func VersionMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        version := c.Request.Header.Get(configuration.GetConfigValue("VersionHeader"))

        // Construct the new URL path based on the version number
        path := fmt.Sprintf("/%s%s", version, c.Request.URL.Path)

        // Modify the request URL path to point to the new version-specific endpoint
        c.Request.URL.Path = path
        c.Next()
    }
}
Salin selepas log masuk

Penyelesaian

Sila semak coretan kod di bawah. Saya menggunakan reverseproxy untuk mengubah hala ke versi yang diberikan. Anda perlu mengesahkan versi yang diberikan dengan teliti. Jika tidak, ia akan mengakibatkan panggilan rekursif.

Nota: Saya menggunakan dua versi /user /user get/v1/user/v2/userget

(

dan

).

Contoh kod

package main

import (
 "net/http"
 "net/http/httputil"
 "regexp"

 "github.com/gin-gonic/gin"
)



func main() {
 router := gin.default()
 router.use(versionmiddleware())


 v1 := router.group("/v1")
 v1.get("/user", func(c *gin.context) {
  c.string(http.statusok, "this is the v1 api")
 })

 v2 := router.group("/v2")
 v2.get("/user", func(c *gin.context) {
  c.string(http.statusok, "this is the v2 api")
 })

 router.run(":8082")
}



func versionmiddleware() gin.handlerfunc {
    return func(c *gin.context) {
  
  // you need to check c.request.url.path whether 
  // already have a version or not, if it has a valid
  // version, return.
  regex, _ := regexp.compile("/v[0-9]+")
  ver := regex.matchstring(c.request.url.path)
  if ver {
   return
  }

  version := c.request.header.get("accept-version")
  
  // you need to validate  given version by the user here.
  // if version is not a valid version, return error 
  // mentioning that given version is invalid.

  director := func(req *http.request) {
    r := c.request
    req.url.scheme = "http"
    req.url.host = r.host
    req.url.path =  "/"+ version + r.url.path
    }
  proxy := &httputil.reverseproxy{director: director}
  proxy.servehttp(c.writer, c.request)
 }
}
Salin selepas log masuk

atau
  • Anda boleh melakukan ini menggunakan pembungkusan gin di bawah.
    Contoh
  • package main
    
    import (
     "net/http"
    
     "github.com/gin-gonic/gin"
     "github.com/udayangaac/stackoverflow/golang/75860989/ginwrapper"
    )
    
    
    
    func main() {
      engine := gin.default()
     router := ginwrapper.newrouter(engine)
    
     defaultrouter := router.default()
     defaultrouter.get("/profile",func(ctx *gin.context) {
    
     })
    
     v1 := router.withversion("/v1")
     v1.get("/user",func(ctx *gin.context) {
      ctx.string(http.statusok, "this is the profile v1 api")
     })
    
     v2 := router.withversion("/v2")
     v2.get("/user",func(ctx *gin.context) {
      ctx.string(http.statusok, "this is the profile v2 api")
     })
    
     
     engine.run(":8082")
    }
    
    Salin selepas log masuk

Pembungkusan

    package ginwrapper
    
    import (
     "fmt"
     "net/http"
    
     "github.com/gin-gonic/gin"
    )
    
    type router struct {
     router *gin.engine
     versiongroups map[string]*gin.routergroup
    }
    
    type versionedrouter struct {
     version string
     router
    }
    
    func newrouter(router *gin.engine) *router {
     return &router{
      router: router,
      versiongroups: make(map[string]*gin.routergroup),
     }
    }
    
    func (a *router) default() versionedrouter {
     return versionedrouter{router: *a }
    }
    
    func  (a *router) withversion(version string) versionedrouter {
     if _,ok := a.versiongroups[version]; ok {
      panic("cannot initialize same version multiple times")
     }
     a.versiongroups[version] = a.router.group(version)
     return versionedrouter{router: *a,version:version }
    }
    
    
    
    
    func (vr versionedrouter) get(relativepath string, handlers ...gin.handlerfunc)  {
     vr.handle(http.methodget,relativepath,handlers...)
    }
    
    // note: you need to follow the same for other http methods.
    // as an example, we can write a method for post http method as below,
    // 
    //  func (vr versionedrouter) post(relativepath string, handlers ...gin.handlerfunc)  {
    //   vr.handle(http.methodpost,relativepath,handlers...)
    //  }
    
    
    
    
    
    func (vr versionedrouter)handle(method,relativepath string, handlers ...gin.handlerfunc)  {
     if !vr.isrouteexist(method,relativepath) {
      vr.router.handle(method,relativepath,func(ctx *gin.context) {
       version := ctx.request.header.get("accept-version")
       if len(version) == 0 {
        ctx.string(http.statusbadrequest,"accept-version header is empty")
       }
       ctx.request.url.path = fmt.sprintf("/%s%s", version, ctx.request.url.path)
       vr.router.handlecontext(ctx)
      })
     }
    
     versionedrelativepath := vr.version + relativepath
     if !vr.isrouteexist(method,versionedrelativepath) {
      vr.router.handle(method,versionedrelativepath,handlers... )
     }
    }
    
    
    func (a versionedrouter) isrouteexist(method,relativepath string) bool {
     for _,route := range a.router.routes() {
      if route.method == method && relativepath == route.path {
       return true
      } 
     }
     return false
    }
    
    
    Salin selepas log masuk
  • Permintaan Contoh/v1/user
  • /v2/user
    curl --location 'localhost:8082/user' \
    --header 'accept-version: v1'
    Salin selepas log masuk
🎜🎜 🎜
curl --location 'localhost:8082/user' \
--header 'Accept-version: v2'
Salin selepas log masuk

Atas ialah kandungan terperinci Pengepala versi berasaskan golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Adakah pengeluaran halaman H5 adalah pembangunan front-end? Adakah pengeluaran halaman H5 adalah pembangunan front-end? Apr 05, 2025 pm 11:42 PM

Ya, pengeluaran halaman H5 adalah kaedah pelaksanaan penting untuk pembangunan front-end, yang melibatkan teknologi teras seperti HTML, CSS dan JavaScript. Pemaju membina halaman H5 yang dinamik dan berkuasa dengan bijak menggabungkan teknologi ini, seperti menggunakan & lt; kanvas & gt; Tag untuk menarik grafik atau menggunakan JavaScript untuk mengawal tingkah laku interaksi.

Harga terbaru Bitcoin pada 2018-2024 USD Harga terbaru Bitcoin pada 2018-2024 USD Feb 15, 2025 pm 07:12 PM

Harga USD Bitcoin masa nyata Faktor yang menjejaskan harga bitcoin Petunjuk untuk meramalkan harga bitcoin masa depan Berikut adalah beberapa maklumat penting mengenai harga Bitcoin pada 2018-2024:

Bagaimana untuk menyesuaikan simbol saiz semula melalui CSS dan menjadikannya seragam dengan warna latar belakang? Bagaimana untuk menyesuaikan simbol saiz semula melalui CSS dan menjadikannya seragam dengan warna latar belakang? Apr 05, 2025 pm 02:30 PM

Kaedah penyesuaian simbol saiz semula dalam CSS bersatu dengan warna latar belakang. Dalam perkembangan harian, kita sering menghadapi situasi di mana kita perlu menyesuaikan butiran antara muka pengguna, seperti menyesuaikan ...

Kenapa unsur-unsur blok sebaris tidak disengajakan? Bagaimana menyelesaikan masalah ini? Kenapa unsur-unsur blok sebaris tidak disengajakan? Bagaimana menyelesaikan masalah ini? Apr 04, 2025 pm 10:39 PM

Mengenai sebab-sebab dan penyelesaian untuk memaparkan unsur-unsur blok sebaris. Apabila menulis susun atur laman web, kami sering menghadapi masalah paparan yang kelihatan aneh. Bandingkan ...

Bagaimana untuk mengawal bahagian atas dan akhir halaman dalam tetapan percetakan penyemak imbas melalui JavaScript atau CSS? Bagaimana untuk mengawal bahagian atas dan akhir halaman dalam tetapan percetakan penyemak imbas melalui JavaScript atau CSS? Apr 05, 2025 pm 10:39 PM

Cara menggunakan JavaScript atau CSS untuk mengawal bahagian atas dan akhir halaman dalam tetapan percetakan penyemak imbas. Dalam tetapan percetakan penyemak imbas, ada pilihan untuk mengawal sama ada paparan ...

Bagaimana cara menggunakan atribut clip-path CSS untuk mencapai kesan lengkung 45 darjah segmen? Bagaimana cara menggunakan atribut clip-path CSS untuk mencapai kesan lengkung 45 darjah segmen? Apr 04, 2025 pm 11:45 PM

Bagaimana untuk mencapai kesan lengkung 45 darjah segmen? Dalam proses melaksanakan segmen, bagaimana membuat sempadan yang betul berubah menjadi lengkung 45 darjah ketika mengklik butang kiri, dan titik ...

Bagaimana untuk mencapai kesan segmentasi dengan sempadan lengkung 45 darjah? Bagaimana untuk mencapai kesan segmentasi dengan sempadan lengkung 45 darjah? Apr 04, 2025 pm 11:48 PM

Petua untuk melaksanakan kesan segmen dalam reka bentuk antara muka pengguna, Segmenter adalah elemen navigasi biasa, terutamanya dalam aplikasi mudah alih dan laman web responsif. …

Teks di bawah susun atur flex ditinggalkan tetapi bekas dibuka? Bagaimana menyelesaikannya? Teks di bawah susun atur flex ditinggalkan tetapi bekas dibuka? Bagaimana menyelesaikannya? Apr 05, 2025 pm 11:00 PM

Masalah pembukaan kontena kerana peninggalan teks yang berlebihan di bawah susun atur flex dan penyelesaian digunakan ...

See all articles