1 回答

TA貢獻1795條經驗 獲得超7個贊
簡而言之:這是將自定義中間件應用于您的 go-swagger 應用程序服務的所有路由。該中間件將ResponseWriter作為自定義值添加到請求上下文中。可以肯定的是,這與 OAuth 無關。
一步一步來:
這context是一種特殊類型,可以跨代碼層攜帶請求范圍的值、截止日期和取消信號。
type customContextKey int8
在這里,我們定義了一個未導出的上下文鍵類型。我們這樣做的原因是,當我們將值添加到上下文時,我們希望該值不會與其他可能與上下文交互的包設置的值發生沖突。例如,如果我們只使用字符串“customContextKey”而其他一些包碰巧使用相同的字符串,就會發生這種情況。更多信息在這里。
const (
_ customContextKey = iota
ctxResponseWriter
)
這里我們創建了一個customContextKey名為ctxResponseWriter1 的值。請注意,我們忽略 ( _) 的第一個值為iota0,而是使用下一個值 1。這是用于存儲的類型安全鍵上下文中的實際ResponseWriter值。
中間件是接受 ahttp.Handler并返回 a的函數http.Handler,它們可以組合在一起,并且是一種以通用方式向應用程序處理程序添加額外功能的模式。要更深入地了解,請查看制作和使用 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)
}
這里的函數以如下方式包裝給定的處理程序:
上下文從請求中提取——
r.Context()
用我們的新密鑰和價值“豐富”
w ResponseWriter
——context.WithValue(..., ctxResponseWriter, w)
請求的上下文被更新的上下文替換——
r.WithContext(rctx)
包裝的處理程序與這個更新的請求一起運行——
handler.ServeHTTP(w, ...)
在一些 http.Handler 中,您可能會像這樣提取值:
func someHandler(w http.ResponseWriter, r *http.Request) {
value, ok := r.Context().Value(ctxResponseWriter).(http.ResponseWriter)
if ok {
// we have the value!
}
}
這一定只是一個使用示例。像這樣傳遞 ResponseWriter 是非常愚蠢的,因為它已經作為參數傳遞給任何 http.Handler ,正如您在上面看到的那樣,并且從應用程序的更深層依賴它是糟糕的設計。例如,更好的用途可能是傳遞請求范圍的記錄器對象。
- 1 回答
- 0 關注
- 220 瀏覽
添加回答
舉報