Dapatkah saya mendefinisikan panggilan grpc dengan permintaan atau respons null?

117

Apakah sintaks rpc di proto3 memungkinkan permintaan atau tanggapan null?

misalnya saya ingin yang setara dengan yang berikut ini:

rpc Logout;
rpc Status returns (Status);
rpc Log (LogData);

Atau haruskah saya membuat tipe null?

message Null {};

rpc Logout (Null) returns (Null);
rpc Status (Null) returns (Status);
rpc Log (LogData) returns (Null);
Mark Kahn
sumber

Jawaban:

165

Komentar Kenton di bawah ini adalah nasihat yang bagus:

... kami sebagai pengembang sangat buruk dalam menebak apa yang mungkin kami inginkan di masa depan. Jadi saya sarankan untuk tetap aman dengan selalu menentukan parameter khusus dan jenis hasil untuk setiap metode, meskipun kosong.


Menjawab pertanyaan saya sendiri:

Melihat melalui file proto default, saya menemukan Empty yang persis seperti tipe Null yang saya sarankan di atas :)

kutipan dari file itu:

// A generic empty message that you can re-use to avoid defining duplicated
// empty messages in your APIs. A typical example is to use it as the request
// or the response type of an API method. For instance:
//
//     service Foo {
//       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
//     }
//

message Empty {

}
Mark Kahn
sumber
33
Iya. Kosong adalah permintaan atau tanggapan kanonis "Saya tidak peduli". Saya akan mencatat, jika Anda berpikir Anda mungkin menginginkan argumen atau mengembalikan nilai di masa depan, buat pesan baru yang tidak memiliki bidang. Dengan begitu, Anda dapat menambahkan kolom baru saat diperlukan dan tidak merusak kode aplikasi apa pun. Kosong sangat bagus ketika Anda tidak akan pernah menginginkan argumen atau mengembalikan nilai.
Eric Anderson
40
@EricAnderson sebagian besar benar, tetapi saya berpendapat bahwa kita sebagai pengembang sangat buruk dalam menebak apa yang mungkin kita inginkan di masa depan. Jadi saya sarankan untuk tetap aman dengan selalu menentukan parameter khusus dan jenis hasil untuk setiap metode, meskipun kosong.
Kenton Varda
1
"... kami sebagai pengembang sangat buruk dalam menebak apa yang mungkin kami inginkan di masa mendatang.", Ini akan memerlukan Emptypesan terpisah untuk setiap pemanggilan fungsi individu? Itu pengorbanan yang cukup.
Robert de W
29

Anda juga dapat menggunakan standar:

import "google/protobuf/empty.proto";
package MyPackage;

service MyService {
  rpc Check(google.protobuf.Empty) returns (google.protobuf.Empty) {}
}
hdnn
sumber
0

Anda juga dapat menggunakan properti bool lain di dalam struktur Reply. seperti ini

message Reply {
  string result = 1;
  bool found = 2;
}

Jadi jika Anda tidak menemukan hasil atau terjadi kesalahan Anda dapat kembali dari kelas layanan ini

return new Reply()
{
   Found = false
};
dkokkinos.dll
sumber