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!
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: ×tamppb.timestamp{seconds: 1590179525, nanos: 0}, }) require.nil(t, err) // assert we got what we want. require.equal(t, "ok", res.text) }) }
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; }
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 c
或 b
端点返回 400。我怎样才能做到这一点?在 protobufs 3 中,他们删除了 required
weglasse. Wie überprüfe ich also, ob ein Nicht-String-Parameter übergeben wird, und reagiere entsprechend?
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
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!