gRPC tidak mengembalikan nilai boolean jika nilainya palsu

PHPz
Lepaskan: 2024-02-10 09:30:09
ke hadapan
407 orang telah melayarinya

如果值为 false,gRPC 不会返回布尔值

Editor PHP Baicao menegaskan semasa memperkenalkan penggunaan gRPC bahawa jika nilai yang ditentukan adalah palsu dalam permintaan gRPC, maka gRPC tidak akan mengembalikan nilai Boolean. Ini bermakna apabila menggunakan gRPC, kita perlu memberi perhatian kepada cara nilai pulangan dikendalikan untuk mengelakkan kekeliruan dan ralat. Memahami butiran ini akan membantu kami lebih memahami dan menggunakan fungsi gRPC serta meningkatkan kecekapan pengaturcaraan dan kualiti kod kami. Mari kita mendalami lebih banyak ciri dan penggunaan gRPC untuk membawa prestasi dan kebolehskalaan yang lebih baik kepada projek kami.

Isi soalan

func (m *todoserver) gettodos(ctx context.context, empty *emptypb.empty) (*desc.gettodosresponse, error) { todos, err := m.todoservice.gettodos() if err != nil { return nil, err } todosresp := make([]*desc.gettodosresponse_todo, 0, len(todos)) for _, todo := range todos { todosresp = append(todosresp, &desc.gettodosresponse_todo{ id: todo.id, title: todo.title, iscompleted: todo.iscompleted, }) } return &desc.gettodosresponse{todos: todosresp}, nil }
Salin selepas log masuk
service TodoService { rpc GetTodos(google.protobuf.Empty) returns (GetTodosResponse) {} } message GetTodosResponse { repeated Todo todos = 1; message Todo { int64 id = 1; string title = 2; bool is_completed = 3; } }
Salin selepas log masuk
Salin selepas log masuk
service TodoService { rpc GetTodos(google.protobuf.Empty) returns (GetTodosResponse) {} } message GetTodosResponse { repeated Todo todos = 1; message Todo { int64 id = 1; string title = 2; bool is_completed = 3; } }
Salin selepas log masuk
Salin selepas log masuk

Saya mempunyai rekod dalam pangkalan data |Nombor |Tajuk |Selesai | |-|-|-| |. 1 |Ahhh|Salah|

Fungsi di atas mengembalikan{"todos": [{"id": "1", "title": "aaa"}]}但一旦我将is_completed更改为true,结果是正确的{"todos ": [{"id": "1", "title": "aaa", "iscompleted": true}]}

Penyelesaian

Ini adalah dengan reka bentuk dan untuk meningkatkan kecekapan.

bool的“零”值是false- 因此,当使用false值初始化protobuf结构时,在使用标准库的encoding/json解组器时不需要显式声明该字段。在编码端,如果字段的 json 标记包含omitempty限定符,则标准库的encoding/jsonMarshaler akan mengalih keluar sebarang nilai sifar - itulah yang anda lihat. Anda akan melihat gelagat yang sama jikatitle字符串字段是""(iaitu nilai sifar rentetan).

Lihat kod yang dijana (*.pb.go),结构体的boolTakrif medan akan kelihatan seperti ini:

type todo struct { // ... iscompleted bool `protobuf:"varint,5,opt,name=is_complete,proto3" json:"is_complete,omitempty"` }
Salin selepas log masuk

Oleh itujson:"...,omitempty"指示encoding/jsonmarshaler meninggalkan sebarang nilai sifar semasa marshaling menggunakan tag ini.

Jika anda ingin mengatasi tingkah laku ini:

  • Adalah mungkin untuk mengalih keluar arahanomitemptydaripada kod yang dijana (tidak disyorkan - kerana keperluan untuk menguruskan penyuntingan semasa kitaran hayat pembangunan). Tetapi jika anda mesti melakukan ini, lihatjawapan ini;
  • Jika menggunakangrpc-gateway, sila gantikannya semasa masa jalan, mis
  • gwmux := runtime.newservemux(runtime.withmarshaleroption(runtime.mimewildcard, &runtime.jsonpb{origname: true, emitdefaults: true}))
    Salin selepas log masuk
    Atau, jika mengeksport json sendiri, tanpa menggunakan perpustakaan standard (
  • :encoding/json),而是使用此包中的json封送拆收器"google.golang.org/protobuf/encoding/protojson"
  • protojson.Marshaler{EmitDefaults: true}.Marshal(w, resp)
    Salin selepas log masuk
    Seperti yang dinyatakan dalam

    jawapan ini.

    Atas ialah kandungan terperinci gRPC tidak mengembalikan nilai boolean jika nilainya palsu. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
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
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!