gRPC tidak mengembalikan nilai boolean jika nilainya palsu

PHPz
Lepaskan: 2024-02-10 09:30:09
ke hadapan
487 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/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"`
}
Salin selepas log masuk

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}))
    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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan