Maison  >  Article  >  développement back-end  >  Comment rendre un champ Protobuf 3 obligatoire ?

Comment rendre un champ Protobuf 3 obligatoire ?

WBOY
WBOYavant
2024-02-09 08:10:28655parcourir

如何使 Protobuf 3 字段成为必填字段?

Protobuf 3 est un format de sérialisation de données efficace, mais lors de l'utilisation, vous devez parfois rendre certains champs obligatoires. Alors, comment rendre obligatoire un champ Protobuf 3 ? Dans cet article, l'éditeur PHP Strawberry vous présentera en détail comment utiliser les fonctionnalités de Protobuf 3 pour implémenter les champs obligatoires et fournira des exemples de code correspondants. Que vous soyez débutant ou développeur expérimenté, cet article peut vous aider à maîtriser rapidement l'utilisation des champs obligatoires et à améliorer la robustesse et la fiabilité de votre code. Nous allons jeter un coup d'oeil!

Contenu de la question

J'écris mon premier point de terminaison API dans Golang en utilisant grpc/proto-buffers. Je suis assez nouveau pour y aller. Ci-dessous le fichier que j'ai écrit pour le cas de test

package my_package

import (
    "context"
    "testing"

    "github.com/stretchr/testify/require"

    "google.golang.org/protobuf/types/known/structpb"
    "github.com/myteam/myproject/cmd/eventstream/setup"
    v1handler "github.com/myteam/myproject/internal/handlers/myproject/v1"
    v1interface "github.com/myteam/myproject/proto/.gen/go/myteam/myproject/v1"
)

func testendpoint(t *testing.t) {
    conf := &setup.config{}

    // initialize our api handlers
    myhandler := v1handler.new(&v1handler.config{})

    t.run("success", func(t *testing.t) {
        res, err := myhandler.endpoint(context.background(), &v1interface.endpointrequest{
            a: "s",
            b: &structpb.struct{
                fields: map[string]*structpb.value{
                    "t": &structpb.value{
                        kind: &structpb.value_stringvalue{
                            stringvalue: "u",
                        },
                    },
                    "v": &structpb.value{
                        kind: &structpb.value_stringvalue{
                            stringvalue: "w",
                        },
                    },
                },
            },
            c: &timestamppb.timestamp{seconds: 1590179525, nanos: 0},
        })
        require.nil(t, err)

        // assert we got what we want.
        require.equal(t, "ok", res.text)
    })


}

Voici comment l'objet v1.go 文件中定义 endpointrequest est inclus ci-dessus :

// An v1 interface Endpoint Request object.
message EndpointRequest {

  // a is something.
  string a = 1 [(validate.rules).string.min_len = 1];

  // b can be a complex object.
  google.protobuf.Struct b = 2;

  // c is a timestamp.
  google.protobuf.Timestamp c = 3;

}

Le cas de test ci-dessus semble fonctionner correctement.

J'ai mis en place une règle de validation qui définit effectivement les paramètres a 成为强制参数,因为它要求 a 是一个至少包含 1 的字符串。因此,如果省略 a et le point final renverra 400.

Mais maintenant, je veux m'assurer si j'oublie le mot-clé cb 端点返回 400。我怎样才能做到这一点?在 protobufs 3 中,他们删除了 required. Alors, comment puis-je vérifier si un paramètre non-chaîne est transmis et réagir en conséquence ?

Solution

La version courte : Vous ne pouvez pas.

required a été supprimé principalement parce qu'il rendait le changement rétrocompatible. Essayer de le réimplémenter avec des options de validation n'est pas si drastique (les changements sont plus faciles), mais souffre des inconvénients comme vous pouvez le constater.

Au lieu de cela, conservez la validation en dehors de la définition du prototype et déplacez-la dans l'application elle-même. Chaque fois que vous recevez un message, vous devez vérifier son contenu (il en va de même lorsque required 出现时也是如此)。在极少数情况下,由 options 或 required apparaît). Dans de rares cas, une simple validation fournie par les options ou

est suffisante. 🎜

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