2017-02-08 2 views
2

Как читать метаданные (переданные как заголовок) на стороне сервера в grpc? Любой пример в голанге?Как читать метаданные в grpc на стороне сервера? (пример golang)

я пишу что-то вроде этого:

// this should be passed from the client side as a context and needs to accessed on server side to read the metadata 
var headers = metadata.New(map[string]string{"authorization": "", "space": "", "org": "", "limit": "", "offset": ""}) 

Я хочу передать маркер авторизации моей функции проверки, чтобы подтвердить полученный маркер.

func validate_token(ctx context.Context, md *metadata.MD) (context.Context, error){ 
    token := headers["authorization"] 
} 

ответ

7

Перед вызовом сервера необходимо вставить свои метаданные в контекст клиента.

Для одинарного 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.

Смежные вопросы