Maison  >  Article  >  développement back-end  >  gRPC ne renvoie pas de valeur booléenne si la valeur est fausse

gRPC ne renvoie pas de valeur booléenne si la valeur est fausse

PHPz
PHPzavant
2024-02-10 09:30:09487parcourir

如果值为 false,gRPC 不会返回布尔值

L'éditeur php Baicao a souligné lors de l'introduction de l'utilisation de gRPC que si la valeur spécifiée est fausse dans la requête gRPC, alors gRPC ne renverra pas de valeur booléenne. Cela signifie que lors de l'utilisation de gRPC, nous devons faire attention à la manière dont les valeurs de retour sont gérées pour éviter toute confusion et erreurs. Comprendre ce détail nous aidera à mieux comprendre et appliquer les fonctions de gRPC, et à améliorer l'efficacité de notre programmation et la qualité de notre code. Examinons davantage de fonctionnalités et d'utilisation de gRPC pour apporter de meilleures performances et évolutivité à nos projets.

Contenu des questions

func (m *todoserver) gettodos(ctx context.context, empty *emptypb.empty) (*desc.gettodosresponse, error) {
    todos, err := m.todoservice.gettodos()
    if err != nil {
        return nil, err
    }

    todosresp := make([]*desc.gettodosresponse_todo, 0, len(todos))
    for _, todo := range todos {
        todosresp = append(todosresp, &desc.gettodosresponse_todo{
            id:          todo.id,
            title:       todo.title,
            iscompleted: todo.iscompleted,
        })
    }

    return &desc.gettodosresponse{todos: todosresp}, nil
}
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr

J'ai un enregistrement dans la base de données |Numéro |Titre |Terminé | |-|-|-| | 1 |Ahhh|Faux|

La fonction ci-dessus renvoie {"todos": [{"id": "1", "title": "aaa"}]} 但一旦我将 is_completed 更改为 true ,结果是正确的 {"todos ": [{"id": "1", "title": "aaa", "iscompleted": true}]}

Solution

C'est par conception et pour améliorer l'efficacité.

bool 的“零”值是 false - 因此,当使用 false 值初始化 protobuf 结构时,在使用标准库的 encoding/json 解组器时不需要显式声明该字段。在编码端,如果字段的 json 标记包含 omitempty 限定符,则标准库的 encoding/json Le marshaleur supprimera toutes les valeurs nulles - c'est ce que vous voyez. Vous verrez le même comportement si title 字符串字段是 "" (c'est-à-dire la valeur zéro de la chaîne).

Voir le code généré (*.pb.go),结构体的 bool Les définitions de champs ressembleront à ceci :

service TodoService {
    rpc GetTodos(google.protobuf.Empty) returns (GetTodosResponse) {}
}

message GetTodosResponse {
    repeated Todo todos = 1;
    message Todo {
        int64 id = 1;
        string title = 2;
        bool is_completed = 3;
    }
}

Par conséquent json:"...,omitempty" 指示 encoding/json le marshaleur omet toutes les valeurs nulles lors du marshaling à l'aide de ces balises.

Si vous souhaitez ignorer ce comportement :

  • Il est possible de supprimer la directive omitempty du code généré (non recommandé - en raison de la nécessité de gérer l'édition pendant le cycle de vie du développement). Mais si vous devez le faire, consultez cette réponse ;
  • Si vous utilisez grpc-gateway, veuillez le remplacer au moment de l'exécution, par exemple
  • .
service TodoService {
    rpc GetTodos(google.protobuf.Empty) returns (GetTodosResponse) {}
}

message GetTodosResponse {
    repeated Todo todos = 1;
    message Todo {
        int64 id = 1;
        string title = 2;
        bool is_completed = 3;
    }
}
  • Ou, si vous exportez vous-même json, sans utiliser la bibliothèque standard (encoding/json),而是使用此包中的 json 封送拆收器 "google.golang.org/protobuf/encoding/protojson" :
type todo struct {
    // ...
    iscompleted  bool  `protobuf:"varint,5,opt,name=is_complete,proto3" json:"is_complete,omitempty"`
}

Comme mentionné dans cette réponse.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer