Установка метаданных grpc в запросе http
Я пытаюсь создать конечные точки REST для существующего сервиса gRPC, используя grpc-gateway. Служба gRPC использует "метаданные", передаваемые в вызовах grpc для аутентификации. Как мне установить метаданные в моих вызовах REST?
Я попытался передать пары значений метаданных в заголовках. Но это не установило метаданные в контексте.
0 ответов
Хитрость здесь в том, чтобы использовать настраиваемое сопоставление входящего заголовка. В исходном коде или в grpc-gatway вы можете видеть, что существует WithIncomingHeaderMatcher, который преобразует входящие HTTP-заголовки в метаданные, передаваемые в контекст (позже используемый обработчиками сервера gRPC). По умолчанию он поддерживает набор так называемых постоянных заголовков HTTP, которые передаются как есть (например, Authorization
заголовок будет выглядеть как Authorization
в контексте), или вам нужно префикс своих пользовательских заголовков с конкретным префиксом, Grpc-Metadata-, посмотрите его использование здесь. В этом случае, Grpc-Metadata-Your-Name
Заголовок HTTP будет выглядеть как Your-Name
поле в метаданных.
Опять же, если это слишком проблематично для вас и для вас, чтобы иметь возможность передать, например. X-User-Id
или любые произвольно отформатированные заголовки в вашем приложении, вам нужно настроить настраиваемое сопоставление заголовков. Я бы порекомендовал обработать ваши заголовки явно, а затем перейти к стандартному (отлично работает, если вы затем обновите свои зависимости и некоторые новые permanentHTTPHeader
добавлен:
func headerMatcher(header string) (string, bool) {
if header == "X-User-Id" {
return "x-user-id", true
}
return runtime.DefaultHeaderMatcher(header)
}
Надеюсь это поможет!