Перед вызовом сервера необходимо вставить свои метаданные в контекст клиента.
Для одинарного RPC на стороне клиента выглядит следующим образом:
conn, _ := grpc.Dial(address, opts...)
client := NewMyClient(conn) // generated from your proto with the grpc protoc option
header := metadata.New(map[string]string{"authorization": "", "space": "", "org": "", "limit": "", "offset": ""})
// this is the critical step that includes your headers
ctx := metadata.NewContext(context.Background(), header)
request := // construct a request for your service
response, err := client.MyMethod(ctx, request)
Для потока, он выглядит почти так же:
conn, _ := grpc.Dial(address, opts...)
client := NewMyClient(conn) // generated from your proto with the grpc protoc option
header := metadata.New(map[string]string{"authorization": "", "space": "", "org": "", "limit": "", "offset": ""})
// this is the critical step that includes your headers
ctx := metadata.NewContext(context.Background(), header)
stream, err := client.MyMethodStream(ctx)
for {
request := // construct a request for your service
err := stream.Send(request)
response := new(Response)
err = stream.RecvMsg(response)
}
На стороне сервера для одинарного RPC:
func (s myServer) MyMethod(context.Context, *Request) (*Response, error) {
headers, ok := metadata.FromContext(ctx)
token := headers["authorization"]
}
и для treaming RPC:
func (s myServer) MyMethodStream(stream MyMethod_MyServiceStreamServer) error {
headers, ok := metadata.FromContext(stream.Context())
token := headers["authorization"]
for {
request := new(Request)
err := stream.RecvMsg(request)
// do work
err := stream.SendMsg(response)
}
}
Обратите внимание, что для потока есть только три раза, что заголовки могут быть посланы: в контексте используется, чтобы открыть начальный поток, через grpc.SendHeader и grpc.SetTrailer. Невозможно установить заголовки на произвольные сообщения в потоке. Для унарного заголовка RPC отправляются с каждым сообщением и могут быть установлены в начальном контексте с помощью grpc.SendHeader и grpc.SetHeader и grpc.SetTrailer.