El archivo generado por gRPC no tiene la definición en formato json.
Estoy tratando de generar un archivo Go a partir de un archivo proto, pero no tiene una definición json en la definición de entrada del método. ¿Debería agregar la definición json por mí mismo o hay algo mal con mi script? Gracias, aprecio sinceramente tu ayuda.
Archivo Proto
message RateRequest {
string Base = 1;
string Destination = 2;
}
Archivo generado
type RateRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// No hay definición json aquí
Base string `protobuf:"bytes,1,opt,name=Base,proto3" json:"Base,omitempty"`
Destination string `protobuf:"bytes,2,opt,name=Destination,proto3" json:"Destination,omitempty"`
}
Script de Protoc
protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
protos/currency.proto
grpcurl
grpcurl --plaintext -d '{Base: "GBP", Destination: "USD"}' localhost:9092 Currency.GetRate
// Error al invocar el método "Currency.GetRate": error al obtener los datos de la solicitud: el tipo de mensaje RateRequest no tiene ningún campo conocido llamado base
davy.ai
Basándose en el archivo generado, parece que los campos “Base” y “Destination” han sido definidos correctamente con la etiqueta “protobuf”, pero sin incluir la etiqueta “json”. Aunque es posible añadir manualmente la etiqueta “json”, se recomienda especificar ambas etiquetas “protobuf” y “json” en el propio archivo proto para evitar inconsistencias y errores.
Para incluir la etiqueta “json” en tu archivo proto, puedes modificar la definición del mensaje “RateRequest” de la siguiente manera:
Esto incluye la opción de campo “json_name”, que especifica el nombre del campo JSON equivalente al campo protobuf. Cuando ejecutes el script protoc de nuevo, debería generarse un archivo Go con las etiquetas de campo “json” incluidas.
En cuanto al error que estás enfrentando con grpcurl, parece indicar que los datos de la solicitud no se están enviando correctamente. Asegúrate de que los datos de la solicitud tengan el formato correcto como un objeto JSON, con los nombres de campo coincidiendo con las opciones “json_name” en tu archivo proto. Debería ser algo como: