unmarshall запрос в gRPC перехватчик - PullRequest
0 голосов
/ 13 февраля 2019

Чтобы выполнить Авторизацию, необходимо прочитать некоторые атрибуты из запроса, чтобы можно было ввести данные для Сервера авторизации

Например, это перехватчик.Здесь prepareAuthZInput вызывается для подготовки ввода

func AuthInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
     input := prepareAuthZInput(info.FullMethod, req)
}

В этой функции есть большая часть if-else, которая проверяет фактический тип для запроса, приводит его к типу, а затем выполняет подготовку ввода.

func prepareAuthZInput(method string, req interface{}) {
   var input Input
   if methodName = "/Data/Call" {
       callRequest, ok := req.(CallRequest)
       if ok {
          // prepare input from callRequest
       }
   } else if methodName = "/Data/Receive" {
       receiveRequest, ok := req.(ReceiveRequest)
       if ok {
          // prepare input from receiveRequest
       }

   }
   return input
}

Как я могу улучшить этот код?

1 Ответ

0 голосов
/ 14 февраля 2019

Когда вы делаете что-то подобное, обычно добавляются данные аутентификации в метаданные вместо сообщений запроса.Таким образом, серверу не нужно проверять все возможные типы полезных данных запроса.

Если вы должны использовать полезную нагрузку запроса, было бы более логично использовать вместо этого переключатель типа:

switch r := req.(type) {
  case CallRequest: // r is a CallRequest...
  case ReceiveRequest: // r is a ReceiveRequest...
  default:
    return status.Errorf(codes.Unimplemented, "unknown request type: %T", req)
}
...