Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk membuat medan Protobuf 3 diperlukan?

Bagaimana untuk membuat medan Protobuf 3 diperlukan?

WBOY
WBOYke hadapan
2024-02-09 08:10:28654semak imbas

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


}

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

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam