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!
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: ×tamppb.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é c
或 b
端点返回 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 ?
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
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!