Как получить заголовки запроса из запроса grpc в Java?

#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")