對于普通的 HTTP 請求,我可以獲得協議、遠程 IP、主機、方法、請求 URL、參考者、用戶代理等詳細資訊。我知道我可以通過這樣做來提取與請求相關的元資料:
var extracted string
meta, ok := metadata.FromIncomingContext(ctx)
if ok {
if value, ok := meta[header]; ok && len(value) > 0 {
extracted = value[0]
}
}
此外,我知道 HTTP 標頭將被插入到元資料中,但這僅適用于通過 HTTP 網關發出的請求,因此來自 GRPC 客戶端的請求不一定包含此資訊。
但我不確定要使用哪些值,header
或者這些資訊是否會在元資料中可用,或者我是否應該檢查其他地方。如何從 GRPC 請求中獲取此請求相關資訊?
uj5u.com熱心網友回復:
Per doc Metadata,以便從元資料中讀取頭部經過Get
之后metadata.FromIncomingContext
。既然MD
是這樣,type MD map[string][]string
您可以嘗試迭代地圖MD
并將其視為與Headers
HTTP 請求相同。
注意:所有鍵將自動轉換為小寫
Doc gRPC over http2
請求標頭作為 HTTP2 標頭在 HEADERS CONTINUATION 幀中傳遞。
請求標頭 → 呼叫定義 *自定義元資料
HTTP2 要求保留的標頭,以“:”開頭的標頭出現在所有其他標頭之前。此外,實作應該在保留的標頭之后立即發送 Timeout,并且它們應該在發送 Custom-Metadata 之前發送 Call-Definition 標頭。
示例代碼
import "google.golang.org/grpc/metadata"
func (s Server) Method(ctx context.Context, *Request) (*Response, error) {
var values []string
md, ok := metadata.FromIncomingContext(ctx)
for key, val := range md {
// get key and val of headers
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/516948.html
標籤:去grpc