Heim > Backend-Entwicklung > Golang > Wie mache ich ein Protobuf 3-Feld erforderlich?

Wie mache ich ein Protobuf 3-Feld erforderlich?

WBOY
Freigeben: 2024-02-09 08:10:28
nach vorne
722 Leute haben es durchsucht

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

Protobuf 3 ist ein effizientes Datenserialisierungsformat, aber während der Verwendung müssen Sie manchmal bestimmte Felder als Pflichtfelder festlegen. Wie macht man also ein Protobuf 3-Feld erforderlich? In diesem Artikel stellt Ihnen der PHP-Editor Strawberry ausführlich vor, wie Sie die Funktionen von Protobuf 3 zur Implementierung erforderlicher Felder nutzen, und stellt entsprechende Codebeispiele bereit. Unabhängig davon, ob Sie Anfänger oder erfahrener Entwickler sind, kann Ihnen dieser Artikel dabei helfen, die Verwendung erforderlicher Felder schnell zu beherrschen und die Robustheit und Zuverlässigkeit Ihres Codes zu verbessern. Lass uns einen Blick darauf werfen!

Frageninhalt

Ich schreibe meinen ersten API-Endpunkt in Golang mit grpc/proto-buffers. Ich bin ziemlich neu. Unten ist die Datei, die ich für den Testfall geschrieben habe

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)
    })


}
Nach dem Login kopieren

So ist das v1.go 文件中定义 endpointrequest-Objekt oben eingebunden:

// 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;

}
Nach dem Login kopieren

Der obige Testfall scheint gut zu funktionieren.

Ich habe eine Validierungsregel eingerichtet, die die Parameter effektiv macht a 成为强制参数,因为它要求 a 是一个至少包含 1 的字符串。因此,如果省略 a und der Endpunkt wird 400 zurückgeben.

Aber jetzt möchte ich sicherstellen, dass ich das Schlüsselwort cb 端点返回 400。我怎样才能做到这一点?在 protobufs 3 中,他们删除了 required weglasse. Wie überprüfe ich also, ob ein Nicht-String-Parameter übergeben wird, und reagiere entsprechend?

Lösung

Die Kurzversion: Das geht nicht.

required wurde hauptsächlich entfernt, weil dadurch die Änderung rückwärtsinkompatibel wurde. Der Versuch, es mit Validierungsoptionen erneut zu implementieren, ist nicht so drastisch (Änderungen sind einfacher), weist aber, wie Sie sehen, die Nachteile auf.

Behalten Sie die Validierung stattdessen außerhalb der Prototypdefinition und verlagern Sie sie in die Anwendung selbst. Wann immer Sie eine Nachricht erhalten, sollten Sie deren Inhalt überprüfen (dasselbe gilt, wenn required 出现时也是如此)。在极少数情况下,由 options 或 required erscheint). In seltenen Fällen reicht eine einfache Validierung durch Optionen oder

aus. 🎜

Das obige ist der detaillierte Inhalt vonWie mache ich ein Protobuf 3-Feld erforderlich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage