Rumah  >  Artikel  >  pembangunan bahagian belakang  >  gRPC tidak mengembalikan nilai boolean jika nilainya palsu

gRPC tidak mengembalikan nilai boolean jika nilainya palsu

PHPz
PHPzke hadapan
2024-02-10 09:30:09460semak imbas

如果值为 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
}
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;
    }
}
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;
    }
}

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/json Marshaler akan mengalih keluar sebarang nilai sifar - itulah yang anda lihat. Anda akan melihat gelagat yang sama jika title 字符串字段是 "" (iaitu nilai sifar rentetan).

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

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

Oleh itu json:"...,omitempty" 指示 encoding/json marshaler meninggalkan sebarang nilai sifar semasa marshaling menggunakan tag ini.

Jika anda ingin mengatasi tingkah laku ini:

  • Adalah mungkin untuk mengalih keluar arahan omitempty daripada kod yang dijana (tidak disyorkan - kerana keperluan untuk menguruskan penyuntingan semasa kitaran hayat pembangunan). Tetapi jika anda mesti melakukan ini, lihat jawapan ini;
  • Jika menggunakan grpc-gateway, sila gantikannya semasa masa jalan, mis
  • gwmux := runtime.newservemux(runtime.withmarshaleroption(runtime.mimewildcard, &runtime.jsonpb{origname: true, emitdefaults: true}))
    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)
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!

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

Artikel berkaitan

Lihat lagi