第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

go-swagger Oauth2 身份驗(yàn)證示例

go-swagger Oauth2 身份驗(yàn)證示例

Go
慕娘9325324 2022-07-11 16:06:36
https://github.com/go-swagger/go-swagger/blob/master/examples/oauth2/restapi/configure_oauth_sample.go誰(shuí)能解釋這段代碼的用途?// This demonstrates how to enrich and pass custom context keys.// In this case, we cache the current responseWriter in context.type customContextKey int8const (    _ customContextKey = iota    ctxResponseWriter)// The middleware configuration is for the handler executors. These do not apply to the swagger.json document.// The middleware executes after routing but before authentication, binding and validationfunc setupMiddlewares(handler http.Handler) http.Handler {    ourFunc := func(w http.ResponseWriter, r *http.Request) {        rctx := context.WithValue(r.Context(), ctxResponseWriter, w)        handler.ServeHTTP(w, r.WithContext(rctx))    }    return http.HandlerFunc(ourFunc)}豐富和傳遞自定義上下文鍵是什么?
查看完整描述

1 回答

?
一只萌萌小番薯

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊

簡(jiǎn)而言之:這是將自定義中間件應(yīng)用于您的 go-swagger 應(yīng)用程序服務(wù)的所有路由。該中間件將ResponseWriter作為自定義值添加到請(qǐng)求上下文中。可以肯定的是,這與 OAuth 無(wú)關(guān)。


一步一步來(lái):


這context是一種特殊類(lèi)型,可以跨代碼層攜帶請(qǐng)求范圍的值、截止日期和取消信號(hào)。


type customContextKey int8

在這里,我們定義了一個(gè)未導(dǎo)出的上下文鍵類(lèi)型。我們這樣做的原因是,當(dāng)我們將值添加到上下文時(shí),我們希望該值不會(huì)與其他可能與上下文交互的包設(shè)置的值發(fā)生沖突。例如,如果我們只使用字符串“customContextKey”而其他一些包碰巧使用相同的字符串,就會(huì)發(fā)生這種情況。更多信息在這里。


const (

    _ customContextKey = iota

    ctxResponseWriter

)

這里我們創(chuàng)建了一個(gè)customContextKey名為ctxResponseWriter1 的值。請(qǐng)注意,我們忽略 ( _) 的第一個(gè)值為iota0,而是使用下一個(gè)值 1。這是用于存儲(chǔ)的類(lèi)型安全鍵上下文中的實(shí)際ResponseWriter值。


中間件是接受 ahttp.Handler并返回 a的函數(shù)http.Handler,它們可以組合在一起,并且是一種以通用方式向應(yīng)用程序處理程序添加額外功能的模式。要更深入地了解,請(qǐng)查看制作和使用 HTTP 中間件。


func setupMiddlewares(handler http.Handler) http.Handler {

    ourFunc := func(w http.ResponseWriter, r *http.Request) {

        rctx := context.WithValue(r.Context(), ctxResponseWriter, w)

        handler.ServeHTTP(w, r.WithContext(rctx))

    }

    return http.HandlerFunc(ourFunc)

}

這里的函數(shù)以如下方式包裝給定的處理程序:

  • 上下文從請(qǐng)求中提取——r.Context()

  • 用我們的新密鑰和價(jià)值“豐富” w ResponseWriter——context.WithValue(..., ctxResponseWriter, w)

  • 請(qǐng)求的上下文被更新的上下文替換——r.WithContext(rctx)

  • 包裝的處理程序與這個(gè)更新的請(qǐng)求一起運(yùn)行——handler.ServeHTTP(w, ...)

在一些 http.Handler 中,您可能會(huì)像這樣提取值:

func someHandler(w http.ResponseWriter, r *http.Request) {

    value, ok := r.Context().Value(ctxResponseWriter).(http.ResponseWriter)

    if ok {

        // we have the value!

    }

}

這一定只是一個(gè)使用示例。像這樣傳遞 ResponseWriter 是非常愚蠢的,因?yàn)樗呀?jīng)作為參數(shù)傳遞給任何 http.Handler ,正如您在上面看到的那樣,并且從應(yīng)用程序的更深層依賴(lài)它是糟糕的設(shè)計(jì)。例如,更好的用途可能是傳遞請(qǐng)求范圍的記錄器對(duì)象。


查看完整回答
反對(duì) 回復(fù) 2022-07-11
  • 1 回答
  • 0 關(guān)注
  • 215 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)