es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , , ,

Answer

  1. Avatar for 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:

    message RateRequest {
        string Base = 1 [(protobuf.field_options) = {json_name: "Base"}];
        string Destination = 2 [(protobuf.field_options) = {json_name: "Destination"}];
    }
    

    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:

    {"Base": "GBP", "Destination": "USD"}
    

Comments are closed.