#grpc #grpc-java
#grpc #grpc-java
Вопрос:
Я создаю сервер Java grpc, и мне трудно получить заголовки запросов. Файлы proto скомпилированы с использованием protobuf-maven-plugin, и на основе сгенерированных заглушек я не могу получить доступ к контексту или метаданным запроса.
Я также пытался определить список ключей / значений в запросе сообщения, надеясь, что grpc позаботится о сопоставлениях заголовков, но пока безуспешно.
Есть идеи, как я могу получить доступ к заголовкам?
Спасибо!
Содержимое моих файлов proto:
...
// Version Request
message VersionRequest {
// key/value pairs
repeated Header headers = 1;
}
message Header {
//key
string key = 1;
//value
string constant = 2;
}
...
...
security_definitions: {
security: {
key: "clientIdAuth";
value: {
type: TYPE_API_KEY;
in: IN_HEADER;
name: "x-client-id";
}
}
security: {
key: "clientSecretAuth";
value: {
type: TYPE_API_KEY;
in: IN_HEADER;
name: "x-client-secret";
}
}
security: {
key: "bearerAuth";
value: {
type: TYPE_API_KEY;
in: IN_HEADER;
name: "Authorization";
}
}
}
...
// Retrieves system version
//
// Retrieves system version
rpc GetVersion(VersionRequest) returns (Version) {
option (google.api.http) = {
get : "/api/v4/version"
};
option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = {
security: {
security_requirement: {
key: "clientIdAuth";
value: {}
}
security_requirement: {
key: "clientSecretAuth";
value: {}
}
security_requirement: {
key: "bearerAuth";
value: {}
}
}
};
}
...
Реализация на стороне сервера выглядит следующим образом:
...
@GrpcService
public class GrpcAPIService extends MixAPIGrpc.MixAPIImplBase {
@Autowired
private MwProxy mwProxy;
@Override
public void getVersion(VersionRequest versionRequest, StreamObserver<Version> streamObserver) {
System.out.println("===============" versionRequest.getHeadersCount());
handleEGrpcCall("getVersion", mwProxy::getVersion, streamObserver);
}
...
versionRequest.getHeadersCount() всегда возвращает 0, хотя во всех моих запросах отправлено 3 заголовка.
Ответ №1:
Если вы не используете пользовательский плагин grpc-java codegen, предоставляемый третьей стороной, стандартный плагин grpc codegen поставляется с библиотекой grpc-java https://search.maven.org/search?q=a:protoc-gen-grpc-java g:io.grpc не поддерживает пользовательские параметры метода, такие как
option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation)
Таким образом, вы не можете воспользоваться этими опциями. Что может сделать grpc-java, так это отправлять и получать io.grpc.Metadata
через перехватчики клиента и сервера. Смотрите примеры: https://github.com/grpc/grpc-java/tree/v1.33.1/examples/src/main/java/io/grpc/examples/header
Ответ №2:
Заголовки, которые, я полагаю, являются заголовками HTTP, о которых вы говорите, принадлежат протоколу HTTP. Вот почему вам не удалось получить его на уровне gRPC. Обязательно извлеките его в сервлете или контроллере, если вы используете MVC framework (добавьте HttpServletRequest request
параметр, как показано ниже).
@GetMapping("hello")
public CompletableFuture<GreetingResponse> greet(HttpServletRequest request, @RequestParams someParam) {
// call gRPC Service here
}
Затем у вас есть доступ к заголовкам с помощью request.getHeader("User-Agent")