日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

提升Go的HTTP路由器的提案

來源: 責編: 時間:2023-08-14 22:01:10 386觀看
導讀譯者 | 劉汪洋審校 | 重樓Go 的標準庫中包含一個穩定且成熟的 HTTP 服務器。然而,內置的請求路由器http.ServeMux 功能較為簡潔,因此你常常需要自己編寫路由代碼。其主要短板是,它并未支持 HTTP 方法的匹配(如GET和POST的

譯者 | 劉汪洋Lhc28資訊網——每日最新資訊28at.com

審校 | 重樓Lhc28資訊網——每日最新資訊28at.com

Go 的標準庫中包含一個穩定且成熟的 HTTP 服務器。然而,內置的請求路由器http.ServeMux 功能較為簡潔,因此你常常需要自己編寫路由代碼。Lhc28資訊網——每日最新資訊28at.com

Lhc28資訊網——每日最新資訊28at.com

其主要短板是,它并未支持 HTTP 方法的匹配(如GET和POST的區別),同時也無法持/users/{user}/settings這種類型的通配符路徑。然而,這兩個功能幾乎是所有 REST 風格的 API 服務器所必需的。Lhc28資訊網——每日最新資訊28at.com

當然,你可以選擇自行實現這些功能。在我以前的一篇文章 Go 中不同的 HTTP 路由方法中,提到過有一些優秀的第三方包可以實現更高級的路由功能,并且只需 約 30 行代碼 就能夠在不借助任何第三方庫的情況下實現類似的功能。Lhc28資訊網——每日最新資訊28at.com

但是,未來可能不再需要這些替代方案和第三方包。現在有一個 活躍的提案 - 還包括一個旨在改進 ServeMux 參考實現 ,使其能夠匹配 HTTP 方法和通配符路徑。Lhc28資訊網——每日最新資訊28at.com

Google 的 Go 團隊成員 Jonathan Amsterdam 主導了這個提案以及之前的 討論。Jonathan 曾成功提出將結構化日志添加到標準庫的提案 - Go 1.21 將包含他的log/slog包(預計 2023 年 8 月發布)。Lhc28資訊網——每日最新資訊28at.com

現狀與變革

在目前的情況下,如果想將 GET 請求匹配到 /users/{user}/settings,你需要編寫以下的樣板代碼(盡管在實踐中你可能會使用第三方庫):Lhc28資訊網——每日最新資訊28at.com

mux.HandleFunc("/users/", func(w http.ResponseWriter, r *http.Request) {    if r.Method != "GET" {        http.Error(w, "method not allowed", http.StatusMethodNotAllowed)        return    }    remainder := r.URL.Path[len("/users/"):]    userId, subPath, _ := strings.Cut(remainder, "/")    switch subPath {    case "settings":        fmt.Fprintf(w, "user %s", userId)    // 其他子路徑可以在這里添加    default:        http.NotFound(w, r)    }})

如果接受了這個提議,你可以更加簡單地實現一樣的功能:Lhc28資訊網——每日最新資訊28at.com

mux.HandleFunc("GET /users/{user}/settings", func(w http.ResponseWriter, r *http.Request) {    fmt.Fprintf(w, "user %s", r.PathValue("user"))})

這樣的寫法明顯更為簡潔!Lhc28資訊網——每日最新資訊28at.com

這與其他流行路由器使用的語法非常相似:Lhc28資訊網——每日最新資訊28at.com

// github.com/go-chi/chirouter.Get("/users/{user}/settings", func(w http.ResponseWriter, r *http.Request) {    fmt.Fprintf(w, "user %s", chi.URLParam(r, "slug"))})// github.com/gorilla/muxrouter.HandleFunc("/users/{user}/settings", func(w http.ResponseWriter, r *http.Request) {    fmt.Fprintf(w, "user %s", mux.Vars(r)["user"])}).Methods("GET")// github.com/bmizerany/patrouter.Get("/users/:user/settings", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {    fmt.Fprintf(w, "user %s", r.URL.Query().Get(":user"))}))// github.com/gin-gonic/ginrouter.GET("/users/:user/settings", func(c *gin.Context) {    fmt.Fprintf(w, "user %s", c.Param("user"))})

提案中的一個有趣決定是,并沒有為 ServeMux 添加新的方法;而是對現有的 Handle  HandleFunc 方法進行了擴展,以支持方法前綴和 {wildcard} 路徑段。Lhc28資訊網——每日最新資訊28at.com

我理解他們避免添加新方法的想法,但我對這個決定持保留態度。遺憾的是,舊版的 ServeMux 接受如 Handle("GET /foo", h) 的模式。這意味著為增強版 ServeMux 編寫的代碼將在舊版 Go 上能正常編譯和運行,但路由不會匹配到任何內容,這容易導致錯誤。我可能會添加新的方法,比如 HandleMatch / HandleMatchFunc 或 Route / RouteFunc。Lhc28資訊網——每日最新資訊28at.com

該提議也詳細描述了處理兩個重疊模式的優先級,其核心規則簡單明了:“如果兩個模式有重疊(有共同的請求),則更具體的模式優先匹配”。Lhc28資訊網——每日最新資訊28at.com

例如,如果你注冊了模式 /users/(匹配 /users/*)以及模式 /users/{user},當一個 /users/ben 的請求進來時,它將匹配第二個,更具體的模式。這與現有的 ServeMux 中,特定主機的模式優先于沒有主機名的模式的行為一致。Lhc28資訊網——每日最新資訊28at.com

URL 末尾通配符匹配

此提案為我們帶來了一個新的"特殊通配符" {$},它專門用于匹配 URL 的末尾。對于那些僅希望匹配主頁路由的情況,這個新特性顯得非常實用。在此之前,要實現這一目標頗為麻煩,因為以 / 結尾的模式會匹配所有 / 之下的內容;這個規則對于只有 / 的模式同樣適用。Lhc28資訊網——每日最新資訊28at.com

因此,以前若想匹配主頁,你需要這樣操作:Lhc28資訊網——每日最新資訊28at.com

mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {    if r.URL.Path != "/" { // 確保路徑就是 "/"        http.NotFound(w, r)        return    }    serveHomepage(w, r)})mux.HandleFunc("/users", serveUsers)

這一過程頗為繁瑣。若你忘記了路徑檢查,那么你最終可能會將主頁用于所有其他的 URL,而不是顯示一個未找到的頁面,因為所有的內容都在 / 之下。Lhc28資訊網——每日最新資訊28at.com

而根據新的提案,這個過程將變得更加簡潔:Lhc28資訊網——每日最新資訊28at.com

mux.HandleFunc("/{$}", serveHomepage)mux.HandleFunc("/users", serveUsers)

實現參考

Jonathan 在 github.com/jba/muxpatterns 中發布了一個 ServeMux 的增強版本的示例實現。唯一的區別在于,由于它是在單獨的包中,無法改變 http.Request 類型, 所以你需要用 mux.PathValue(request, "name") 來獲取路徑值,而非 request.PathValue("name")。Lhc28資訊網——每日最新資訊28at.com

我在 我的 go-routing 倉庫 中添加了一個 PR,這個 PR 提供了我自己的 widget API 的一種實現,使用 muxpatterns。這個版本與 chi 版本 非常相似 —— 清晰且易讀:Lhc28資訊網——每日最新資訊28at.com

r.HandleFunc("GET /{$}", home)r.HandleFunc("GET /contact", contact)r.HandleFunc("GET /api/widgets", apiGetWidgets)r.HandleFunc("POST /api/widgets", apiCreateWidget)r.HandleFunc("POST /api/widgets/{slug}", apiUpdateWidget)r.HandleFunc("POST /api/widgets/{slug}/parts", apiCreateWidgetPart)r.HandleFunc("POST /api/widgets/{slug}/parts/{id}/update", apiUpdateWidgetPart)r.HandleFunc("POST /api/widgets/{slug}/parts/{id}/delete", apiDeleteWidgetPart)r.HandleFunc("GET /{slug}", widgetGet)r.HandleFunc("GET /{slug}/admin", widgetAdmin)r.HandleFunc("POST /{slug}/image", widgetImage)

當我首次測試這個參考實現時,我發現了一些小問題,現已得到修復。Lhc28資訊網——每日最新資訊28at.com

結論

盡管我對于擴展現有的 Handle 和 HandleFunc 方法有一些保留,但我對這個提案的考慮感到欣慰。鑒于 Jonathan 在提案中的謹慎處理、他在 log/slog 上的良好表現以及社區的積極反饋,此提案被接受的可能性很高。Lhc28資訊網——每日最新資訊28at.com

如果這個功能能進入標準庫,那將非常棒 —— 我開發的幾乎所有網站和 REST 風格的 API 都將用到這個功能。Go 的標準庫已經非常強大,但加入這個功能將進一步減少對第三方路由器的依賴。Lhc28資訊網——每日最新資訊28at.com

如果這個功能能夠集成在 2024 年 2 月發布的 Go 1.22 中,我并不會感到驚訝。讓我們拭目以待!Lhc28資訊網——每日最新資訊28at.com

譯者介紹

劉汪洋,51CTO社區編輯,昵稱:明明如月,一個擁有 5 年開發經驗的某大廠高級 Java 工程師,擁有多個主流技術博客平臺博客專家稱號。Lhc28資訊網——每日最新資訊28at.com

原文標題:The proposal to enhance Go’s HTTP router,作者:Ben HoytLhc28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-5719-0.html提升Go的HTTP路由器的提案

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: SpringBoot使用WebSocket實現即時消息

下一篇: 穿上App外衣,保持Web靈魂——PWA溫故

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
午夜精品久久久久久久99樱桃| 精品成人在线观看| 欧美久久影院| 欧美系列亚洲系列| 国产伦精品一区二区三区视频孕妇 | 亚洲国产日韩一级| 亚洲欧洲精品天堂一级| 中文一区二区| 欧美一区二区在线播放| 免费视频一区二区三区在线观看| 欧美日韩不卡一区| 国产日韩欧美日韩| 亚洲久色影视| 欧美一级午夜免费电影| 欧美大片国产精品| 国产精品素人视频| 在线看片第一页欧美| 亚洲素人在线| 老司机一区二区三区| 欧美日韩一区二区高清| 韩国v欧美v日本v亚洲v| 日韩一级黄色av| 欧美在线国产| 欧美日韩国产不卡| 激情五月综合色婷婷一区二区| 夜夜嗨av一区二区三区四季av| 久久精品99| 欧美性猛交一区二区三区精品| 一区二区三区我不卡| 亚洲一级片在线观看| 美女91精品| 国产精品综合网站| 亚洲日本一区二区| 久久精品国产欧美亚洲人人爽| 欧美日韩一区二区免费视频| 激情懂色av一区av二区av| 亚洲一二三区精品| 一区二区三区在线视频免费观看| 国产一区二区精品在线观看| 91久久久久久国产精品| 亚洲欧美日韩直播| 欧美午夜电影在线观看| 亚洲欧洲日韩在线| 久久天堂av综合合色| 国产情侣一区| 欧美插天视频在线播放| 亚洲女ⅴideoshd黑人| 国产精品老女人精品视频| 日韩视频二区| 国产精品有限公司| 午夜免费日韩视频| 亚洲欧洲免费视频| 亚洲国产美女| 日韩午夜高潮| 国产精品午夜在线| 欧美激情综合色| 午夜久久久久久| 国产欧美日韩免费看aⅴ视频| 午夜国产精品影院在线观看| 欧美日韩在线观看一区二区| 亚洲人体偷拍| 欧美巨乳在线| 亚洲影视中文字幕| 好吊妞这里只有精品| 欧美黄色一区| 香蕉成人久久| 欧美在线亚洲一区| 夜夜爽夜夜爽精品视频| 亚洲精品免费一二三区| 国产精品videosex极品| 亚洲天堂成人| 亚洲电影下载| 国产精品美女一区二区在线观看| 亚洲欧洲在线看| 麻豆av一区二区三区久久| 亚洲国产小视频| 国产精品久久久一本精品| 欧美三级网页| 亚洲女同在线| 中文国产成人精品久久一| 亚洲毛片在线| 一区二区成人精品| 亚洲资源av| 久久久国产精品一区| 欧美激情一区二区三区不卡| 欧美日韩成人一区二区| 久久在线播放| 欧美激情国产日韩| 亚洲精品黄色| 欧美日韩国产a| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美国产亚洲精品久久久8v| 亚洲国产成人不卡| 欧美电影在线观看| 日韩视频在线观看免费| 欧美日韩亚洲视频| 亚洲一区二区三区欧美| 国产深夜精品| 久久漫画官网| 久久久噜噜噜久久| 国产精品免费在线| 香蕉免费一区二区三区在线观看| 国产日产欧美a一级在线| 久久九九精品| 91久久线看在观草草青青| 欧美日韩成人一区二区三区| 亚洲小视频在线| 国产亚洲一区二区在线观看| 久久亚洲美女| 日韩视频在线一区| 国产精品久久一区二区三区| 久久超碰97人人做人人爱| 亚洲电影观看| 欧美日韩在线精品| 香蕉亚洲视频| 1204国产成人精品视频| 欧美日韩国产一区二区三区地区 | 国产精品永久免费观看| 久久精品人人| 亚洲人成毛片在线播放| 国产精品久久精品日日| 欧美在线亚洲| 亚洲日本电影| 国产精品区二区三区日本| 久久人人爽人人爽爽久久| 亚洲美女视频网| 国产欧美日本一区二区三区| 麻豆久久婷婷| 亚洲一区二区三区免费观看| 黄页网站一区| 欧美日韩中文字幕在线视频| 欧美高清视频www夜色资源网| 国产在线国偷精品产拍免费yy| 午夜一区二区三区在线观看| 国产亚洲一区在线| 麻豆成人精品| 亚洲视频专区在线| 一区久久精品| 欧美日韩成人综合| 欧美一区二区精品久久911| 亚洲国产精品久久人人爱蜜臀| 欧美日韩一区在线| 午夜久久美女| 亚洲国产精品久久久久婷婷884| 欧美日韩精品一区| 久久久999精品视频| 日韩小视频在线观看专区| 国产亚洲亚洲| 欧美日韩免费观看一区二区三区 | 国模精品娜娜一二三区| 欧美精品啪啪| 欧美主播一区二区三区美女 久久精品人| 亚洲第一免费播放区| 国产精品毛片a∨一区二区三区|国| 久久一区二区三区四区五区| 一区二区三区四区五区精品| 好吊一区二区三区| 国产精品久久久久99| 欧美顶级大胆免费视频| 久久黄色级2电影| 亚洲一区欧美二区| 亚洲精品一区二区在线观看| 国内外成人免费激情在线视频 | 国产精品v欧美精品v日韩| 你懂的视频一区二区| 欧美亚洲综合久久| 正在播放欧美视频| 亚洲激情视频在线观看| 国产一区二区三区的电影 | 亚洲精品永久免费| 精品av久久707| 国产视频在线观看一区| 国产精品v日韩精品| 欧美激情精品久久久久久变态| 久久久久久久久伊人| 亚洲欧美日韩国产综合精品二区 | 欧美一级在线播放| 一区二区日韩欧美| 亚洲日本一区二区三区| 一区二区三区在线高清| 国产欧美日韩综合| 国产精品yjizz| 欧美日韩精品一二三区| 一区二区三区高清不卡| 久久福利毛片| 亚洲人成绝费网站色www| 国产午夜亚洲精品羞羞网站| 欧美日韩综合精品| 欧美福利视频网站| 久久青青草原一区二区| 亚洲欧美中文另类| 在线一区二区三区四区五区| 亚洲国产综合在线看不卡| 黄色一区二区在线| 国模吧视频一区| 国产亚洲精品一区二555| 国产老肥熟一区二区三区| 国产精品久久夜| 国产精品久久久亚洲一区| 国产精品免费看久久久香蕉| 国产精品狠色婷| 国产精品你懂的在线欣赏| 国产精品理论片| 国产麻豆精品视频|