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

Wie mache ich ein Protobuf 3-Feld erforderlich?

WBOY
WBOYnach vorne
2024-02-09 08:10:28655Durchsuche

如何使 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)
    })


}

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 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen