Boş istek veya yanıtı olan bir grpc çağrısı tanımlayabilir miyim?


117

Proto3'teki rpc sözdizimi boş isteklere veya yanıtlara izin veriyor mu?

örneğin aşağıdakilerin eşdeğerini istiyorum:

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

Yoksa sadece boş bir tip mi oluşturmalıyım?

message Null {};

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

Yanıtlar:


165

Kenton'ın aşağıdaki yorumu sağlam bir tavsiye:

... geliştiriciler olarak gelecekte ne isteyebileceğimizi tahmin etmekte gerçekten kötüyüz. Bu nedenle, boş olsalar bile her yöntem için her zaman özel parametreler ve sonuç türleri tanımlayarak güvenli olmanızı öneririm.


Kendi sorumu cevaplıyorum:

Varsayılan proto dosyalar arasında bakınca, rastladım Boş Boş Yukarıda önerilen tip aynen gibi olduğunu :)

o dosyadan alıntı:

// 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 {

}

33
Evet. Boş, kurallı "Umurumda değil" isteği veya yanıtıdır. Ben size düşünüyorsanız, dikkat edecektir olabilir , ileride argümanlar veya dönüş değerlerini istemek basitçe hiçbir alanlara sahip olduğundan yeni bir ileti olun. Bu şekilde, ihtiyaç duyduğunuzda ve herhangi bir uygulama kodunu bozmadan yeni alanlar ekleyebilirsiniz. Boş, hiçbir zaman bağımsız değişkenler veya dönüş değerleri istemeyeceğiniz zamanlar için harikadır.
Eric Anderson

40
@EricAnderson çoğunlukla haklı, ancak geliştiriciler olarak gelecekte ne isteyebileceğimizi tahmin etmekte gerçekten kötü olduğumuzu iddia ediyorum . Bu nedenle, boş olsalar bile her yöntem için her zaman özel parametreler ve sonuç türleri tanımlayarak güvenli olmanızı öneririm.
Kenton Varda

1
"... geliştiriciler olarak gelecekte ne isteyebileceğimizi tahmin etmekte gerçekten kötüyiz.", Bu, Emptyher bir işlev çağrısı için ayrı bir mesaj gerektiriyor mu? Bu oldukça büyük bir fedakarlık.
Robert de W

29

Ayrıca önceden tanımlanmış olanları da kullanabilirsiniz:

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

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

0

Reply yapısının içinde başka bir bool özelliğini de kullanabilirsiniz. bunun gibi

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

yani sonucu bulamazsanız veya bir hata olursa, bu hizmet sınıfından geri dönebilirsiniz.

return new Reply()
{
   Found = false
};
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.