grpcurl для отправки сообщения типа «Любой»

#protocol-buffers #protobuf-java #proto3 #grpcurl

Вопрос:

Как отправить сообщение типа «Любой» с помощью grpcurl?

У меня есть этот прото:

 message MyRequest {
  string request_id = 1;
  repeated google.protobuf.Any payload = 2;
}
 

Я отправляю этот запрос:

 {
   "request_id":"1",
   "payload":[
      {
         "@type":"type.googleapis.com/com.my.type.Payload",
         "id":"12345",
         "message": "Hello",
      }
   ]
}
 

grpcurl -открытый текст-d ‘{«request_id»: «1», «полезная нагрузка»: [{«@тип»: «type.googleapis.com/com.my.type.Полезная нагрузка», «идентификатор»: «12345», «сообщение»: «Привет»}]}’ локальный хост:1000 com.my.service.Имя службы/Метод

но я получаю ошибку: Error invoking method "com.my.service.ServiceName/Method": error getting request data: unknown message type "com.my.type.Payload"

Сервер является проектом Spring Boot в Котлине, поэтому я добавил компонент

 @Bean
fun protobufJsonFormatHttpMessageConverter(): ProtobufHttpMessageConverter? {
    val typeRegistry: JsonFormat.TypeRegistry = JsonFormat.TypeRegistry.newBuilder()
        .add(com.my.type.Payload.getDescriptor())
        .build()

    val printer = JsonFormat.printer().usingTypeRegistry(typeRegistry)
    return ProtobufJsonFormatHttpMessageConverter(JsonFormat.parser(), printer)
}
 

Но это не помогло. Как это исправить?

Комментарии:

1. Я подозреваю-но не знаю, — что вам нужно кодировать payload как []byte , а не рассматривать как инкапсулированное сообщение. К сожалению, я не знаю, как бы вы его закодировали, но, возможно, вам сойдет с рук base64.

2. Возможно, стоит отправить вопрос в gRPCurl репо и спросить там: github.com/fullstorydev/grpcurl/issues

3. Спасибо, нашел там ту же проблему: github.com/fullstorydev/grpcurl/issues/193

4. Пожалуйста. Я пытался найти там проблемы для вас и не нашел ни одной!