亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
? 什麼是HTTP 中間件?
? 示例:日誌中間件
? 示例:身份驗(yàn)證中間件
?? 使用中間件組合多個(gè)功能
? 中間件順序很重要!
? 更優(yōu)雅的寫法:中間件工具包
? 總結(jié)要點(diǎn)
首頁 後端開發(fā) Golang 以身作則http中間件

以身作則http中間件

Jul 26, 2025 am 09:36 AM
go 中介軟體

在Go 語言中,HTTP 中間件是通過函數(shù)實(shí)現(xiàn)的,其核心答案為:中間件是一個(gè)接收並返回http.Handler 的函數(shù),用於在請求處理前後執(zhí)行通用邏輯。 1. 中間件函數(shù)簽名形如func(Middleware(next http.Handler) http.Handler),通過包裝原有處理器實(shí)現(xiàn)功能擴(kuò)展;2. 示例中的日誌中間件記錄請求方法、路徑、客戶端地址及處理耗時(shí),便於監(jiān)控和調(diào)試;3. 身份驗(yàn)證中間件檢查Authorization 頭,驗(yàn)證失敗時(shí)返回401 或403 錯(cuò)誤,確保安全訪問;4. 多個(gè)中間件可通過嵌套調(diào)用組合使用,執(zhí)行順序?yàn)閺耐獾絻?nèi)進(jìn)入,從內(nèi)到外返回,因此順序至關(guān)重要;5. 可通過定義Middleware 類型和chainMiddleware 函數(shù)實(shí)現(xiàn)更優(yōu)雅的中間件鍊式組合;6. 常見應(yīng)用場景包括日誌記錄、認(rèn)證授權(quán)、超時(shí)控制、跨域支持(CORS)、限流和panic 恢復(fù)等;7. 所有功能均可基於net/http 原生包實(shí)現(xiàn),無需依賴第三方框架,具備高可維護(hù)性和可擴(kuò)展性。 Go 的中間件模式簡潔、靈活且高度可組合,適合構(gòu)建結(jié)構(gòu)清晰的Web 服務(wù)。

go by example http middleware

在Go 語言中,HTTP 中間件(Middleware)是一種非常常見且強(qiáng)大的模式,用於在請求到達(dá)處理函數(shù)之前或之後執(zhí)行一些通用邏輯,比如日誌記錄、身份驗(yàn)證、超時(shí)控制、跨域支持等。

go by example http middleware

下面通過一個(gè)清晰的示例來說明如何編寫和使用HTTP 中間件。


? 什麼是HTTP 中間件?

中間件本質(zhì)上是一個(gè)函數(shù),它接收一個(gè)http.Handler並返回一個(gè)新的http.Handler 。它可以對請求進(jìn)行預(yù)處理、調(diào)用下一個(gè)處理器、並在之後執(zhí)行後處理邏輯。

go by example http middleware

函數(shù)簽名通常如下:

 func Middleware(next http.Handler) http.Handler

? 示例:日誌中間件

這個(gè)中間件會(huì)記錄每個(gè)請求的method、URL 和處理時(shí)間。

go by example http middleware
 package main

import (
    "log"
    "net/http"
    "time"
)

// 日誌中間件func loggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()

        // 打印請求信息log.Printf("Started %s %s from %s", r.Method, r.URL.Path, r.RemoteAddr)

        // 調(diào)用下一個(gè)處理器next.ServeHTTP(w, r)

        // 請求處理完成後打印耗時(shí)log.Printf("Completed %s in %v", r.URL.Path, time.Since(start))
    })
}

? 示例:身份驗(yàn)證中間件

這個(gè)中間件檢查請求頭中是否有有效的Authorization 。

 func authMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        token := r.Header.Get("Authorization")
        if token == "" {
            http.Error(w, "Authorization token required", http.StatusUnauthorized)
            return
        }

        // 這裡可以加更複雜的驗(yàn)證邏輯(如JWT)
        if token != "Bearer mysecret" {
            http.Error(w, "Invalid token", http.StatusForbidden)
            return
        }

        // 驗(yàn)證通過,調(diào)用下一個(gè)處理器next.ServeHTTP(w, r)
    })
}

?? 使用中間件組合多個(gè)功能

Go 的http.Handler組合方式非常靈活。你可以將多個(gè)中間件“包裝”在最終的處理器外層。

 func helloHandler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello, World!"))
}

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/hello", helloHandler)

    // 組合中間件:先日誌,再認(rèn)證,最後路由handler := loggingMiddleware(authMiddleware(mux))

    log.Println("Server starting on :8080...")
    http.ListenAndServe(":8080", handler)
}

請求流程:
Request → loggingMiddleware → authMiddleware → mux → helloHandler → 返回


? 中間件順序很重要!

中間件的執(zhí)行順序是從外到內(nèi)進(jìn)入,從內(nèi)到外返回

 // 例如:
final := A(B(C(handler)))

執(zhí)行順序:

  • 進(jìn)入:A → B → C
  • 處理:handler
  • 返回:C → B → A

所以順序會(huì)影響行為。比如日誌中間件通常放在最外層,以便記錄完整耗時(shí)。


? 更優(yōu)雅的寫法:中間件工具包

你可以定義一個(gè)類型來方便組合中間件:

 type Middleware func(http.Handler) http.Handler

func chainMiddleware(mw ...Middleware) Middleware {
    return func(final http.Handler) http.Handler {
        result := final
        for i := len(mw) - 1; i >= 0; i-- {
            result = mw[i](result)
        }
        return result
    }
}

使用方式:

 middlewareChain := chainMiddleware(loggingMiddleware, authMiddleware)
http.ListenAndServe(":8080", middlewareChain(mux))

? 總結(jié)要點(diǎn)

  • 中間件是func(http.Handler) http.Handler類型的函數(shù)。
  • 使用http.HandlerFunc包裝便於操作。
  • 中間件可以組合,順序影響執(zhí)行流程。
  • 常見用途:日誌、認(rèn)證、限流、CORS、Panic 恢復(fù)等。
  • 不依賴第三方框架,原生net/http就能實(shí)現(xiàn)。

基本上就這些。 Go 的中間件模式簡單、清晰、可組合,非常適合構(gòu)建可維護(hù)的Web 服務(wù)。

以上是以身作則http中間件的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
GO應(yīng)用程序的標(biāo)準(zhǔn)項(xiàng)目佈局是什麼? GO應(yīng)用程序的標(biāo)準(zhǔn)項(xiàng)目佈局是什麼? Aug 02, 2025 pm 02:31 PM

答案是:Go應(yīng)用沒有強(qiáng)制項(xiàng)目佈局,但社區(qū)普遍採用一種標(biāo)準(zhǔn)結(jié)構(gòu)以提升可維護(hù)性和擴(kuò)展性。 1.cmd/存放程序入口,每個(gè)子目錄對應(yīng)一個(gè)可執(zhí)行文件,如cmd/myapp/main.go;2.internal/存放私有代碼,不可被外部模塊導(dǎo)入,用於封裝業(yè)務(wù)邏輯和服務(wù);3.pkg/存放可公開復(fù)用的庫,供其他項(xiàng)目導(dǎo)入;4.api/可選,存放OpenAPI、Protobuf等API定義文件;5.config/、scripts/、web/分別存放配置文件、腳本和Web資源;6.根目錄包含go.mod和go.sum

您如何在Go中逐行讀取文件? 您如何在Go中逐行讀取文件? Aug 02, 2025 am 05:17 AM

使用bufio.Scanner是Go中逐行讀取文件最常見且高效的方法,適用於處理大文件、日誌解析或配置文件等場景。 1.使用os.Open打開文件並確保通過deferfile.Close()關(guān)閉文件。 2.通過bufio.NewScanner創(chuàng)建掃描器實(shí)例。 3.在for循環(huán)中調(diào)用scanner.Scan()逐行讀取,直到返回false表示到達(dá)文件末尾或出錯(cuò)。 4.使用scanner.Text()獲取當(dāng)前行內(nèi)容(不含換行符)。 5.循環(huán)結(jié)束後檢查scanner.Err()以捕獲可能的讀取錯(cuò)誤。此方法內(nèi)存效

您如何處理GO Web應(yīng)用程序中的路由? 您如何處理GO Web應(yīng)用程序中的路由? Aug 02, 2025 am 06:49 AM

Go應(yīng)用中的路由選擇取決於項(xiàng)目複雜度,1.使用標(biāo)準(zhǔn)庫net/httpServeMux適合簡單應(yīng)用,無需外部依賴且輕量,但不支持URL參數(shù)和高級(jí)匹配;2.第三方路由器如Chi提供中間件、路徑參數(shù)和嵌套路由,適合模塊化設(shè)計(jì);3.Gin性能優(yōu)異,內(nèi)置JSON處理和豐富功能,適合API和微服務(wù)。應(yīng)根據(jù)是否需要靈活性、性能或功能集成來選擇,小型項(xiàng)目用標(biāo)準(zhǔn)庫,中大型項(xiàng)目推薦Chi或Gin,最終實(shí)現(xiàn)從簡單到復(fù)雜的平滑擴(kuò)展。

GO中的構(gòu)建約束是什麼? GO中的構(gòu)建約束是什麼? Jul 31, 2025 am 02:53 AM

BuildconstraintsinGoarecommentslike//go:buildthatcontrolfileinclusionduringcompilationbasedonconditionssuchasOS,architecture,orcustomtags.2.TheyareplacedbeforethepackagedeclarationwithablanklineinbetweenandsupportBooleanoperatorslike&&,||,and

您如何在GO中解析命令行旗幟? 您如何在GO中解析命令行旗幟? Aug 02, 2025 pm 04:24 PM

Go的flag包可輕鬆解析命令行參數(shù),1.使用flag.Type()定義字符串、整型、布爾等類型標(biāo)誌;2.可通過flag.TypeVar()將標(biāo)誌解析到變量避免指針操作;3.調(diào)用flag.Parse()後,用flag.Args()獲取後續(xù)位置參數(shù);4.實(shí)現(xiàn)flag.Value接口可支持自定義類型,滿足多數(shù)簡單CLI需求,複雜場景可用spf13/cobra庫替代。

您如何使用諸如if-else in go中的條件語句? 您如何使用諸如if-else in go中的條件語句? Aug 02, 2025 pm 03:16 PM

Go中的if-else語句無需括號(hào)但必須使用花括號(hào),支持在if中初始化變量以限製作用域,可通過elseif鍊式判斷條件,常用於錯(cuò)誤檢查,且變量聲明與條件結(jié)合可提升代碼簡潔性與安全性。

您如何在Go中宣布常數(shù)? 您如何在Go中宣布常數(shù)? Aug 02, 2025 pm 04:21 PM

在Go中,常量使用const關(guān)鍵字聲明,且值不可更改,可為無類型或有類型;1.單個(gè)常量聲明如constPi=3.14159;2.塊內(nèi)多個(gè)常量聲明如const(Pi=3.14159;Language="Go";IsCool=true);3.顯式類型常量如constSecondsInMinuteint=60;4.使用iota生成枚舉值,如const(Sunday=iota;Monday;Tuesday)將依次賦值0、1、2,且iota可用於位運(yùn)算等表達(dá)式;常量必須在編譯時(shí)確定值,

去處理並發(fā)如何? 去處理並發(fā)如何? Jul 31, 2025 am 09:43 AM

GoHandlesCurrencyThroughgoroutinesandChannels,EnaplingSimple,Safe和ScalableconCurrentProgramming.1.goroutinesarelelightweightthreadsmanagedsmanagedsmanagedbythegoruntime,startwithTheGokeyWord,andrequireminiminiminiminiminimalresourcesduetosourcesduetostosmall,andrequeminiminiminiminiminimalresorcesmallestosmall,growableStacks.2.ChannelsellitItItIt

See all articles