Bagaimana untuk membuat medan Protobuf 3 diperlukan?

WBOY
Lepaskan: 2024-02-09 08:10:28
ke hadapan
671 orang telah melayarinya

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

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!

Kandungan soalan

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: &timestamppb.timestamp{seconds: 1590179525, nanos: 0},
        })
        require.nil(t, err)

        // assert we got what we want.
        require.equal(t, "ok", res.text)
    })


}
Salin selepas log masuk

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;

}
Salin selepas log masuk

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 cb 端点返回 400。我怎样才能做到这一点?在 protobufs 3 中,他们删除了 required. Jadi bagaimana saya boleh menyemak sama ada parameter bukan rentetan diluluskan dan bertindak balas dengan sewajarnya?

Penyelesaian

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

sudah memadai. 🎜

Atas ialah kandungan terperinci Bagaimana untuk membuat medan Protobuf 3 diperlukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!