Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk membuat medan Protobuf 3 diperlukan?
Protobuf 3 ialah format siri data yang cekap, tetapi semasa penggunaan, kadangkala anda perlu membuat medan tertentu diperlukan. Jadi, bagaimana anda membuat medan Protobuf 3 diperlukan? Dalam artikel ini, editor PHP Strawberry akan memperkenalkan anda secara terperinci cara menggunakan ciri Protobuf 3 untuk melaksanakan medan yang diperlukan, dan memberikan contoh kod yang sepadan. Sama ada anda seorang pemula atau pembangun berpengalaman, artikel ini boleh membantu anda menguasai penggunaan medan yang diperlukan dengan cepat dan meningkatkan keteguhan dan kebolehpercayaan kod anda. Mari lihat!
Saya sedang menulis titik akhir api pertama saya di golang menggunakan grpc/proto-buffers. Saya agak baru untuk pergi. Di bawah adalah fail yang saya tulis untuk kes ujian
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) }) }
Beginilah cara objek v1.go
文件中定义 endpointrequest
disertakan di atas:
// 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; }
Kes ujian di atas nampaknya berfungsi dengan baik.
Saya menyediakan peraturan pengesahan yang berkesan membuat parameter a
成为强制参数,因为它要求 a
是一个至少包含 1 的字符串。因此,如果省略 a
dan titik akhir akan mengembalikan 400.
Tetapi sekarang saya ingin memastikan jika saya meninggalkan kata kunci c
或 b
端点返回 400。我怎样才能做到这一点?在 protobufs 3 中,他们删除了 required
. Jadi bagaimana saya boleh menyemak sama ada parameter bukan rentetan diluluskan dan bertindak balas dengan sewajarnya?
Versi pendek: Anda tidak boleh.
required
telah dialih keluar terutamanya kerana ia menjadikan perubahan ke belakang tidak serasi. Cuba untuk melaksanakannya semula dengan pilihan pengesahan tidak begitu drastik (perubahan lebih mudah), tetapi mengalami kelemahan seperti yang anda lihat.
Sebaliknya, simpan pengesahan di luar definisi prototaip dan alihkannya ke dalam aplikasi itu sendiri. Setiap kali anda menerima mesej, anda harus menyemak kandungannya (begitu juga apabila required
出现时也是如此)。在极少数情况下,由 options 或 required
muncul). Dalam kes yang jarang berlaku, pengesahan mudah yang disediakan oleh pilihan atau
Atas ialah kandungan terperinci Bagaimana untuk membuat medan Protobuf 3 diperlukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!