ฉันสามารถกำหนดการเรียก grpc ด้วยคำขอหรือการตอบกลับที่ว่างเปล่าได้หรือไม่


118

ไวยากรณ์ rpc ใน proto3 อนุญาตคำขอหรือการตอบกลับที่เป็นโมฆะหรือไม่

เช่นฉันต้องการสิ่งต่อไปนี้เทียบเท่า:

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

หรือฉันควรสร้างประเภท null?

message Null {};

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

คำตอบ:


167

ความคิดเห็นของ Kenton ด้านล่างเป็นคำแนะนำที่ดี:

... พวกเราในฐานะนักพัฒนานั้นเดาไม่ถูกว่าเราอาจต้องการอะไรในอนาคต ดังนั้นฉันขอแนะนำให้ปลอดภัยโดยการกำหนดพารามิเตอร์และประเภทผลลัพธ์ที่กำหนดเองสำหรับทุกวิธีเสมอแม้ว่าจะว่างเปล่าก็ตาม


ตอบคำถามของตัวเอง:

เมื่อดูไฟล์โปรโตเริ่มต้นฉันเจอEmptyซึ่งเหมือนกับประเภท Null ที่ฉันแนะนำไว้ข้างต้น :)

ตัดตอนมาจากไฟล์นั้น:

// 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
ใช่. ว่างเปล่าคือคำขอหรือคำตอบ "ฉันไม่สนใจ" ตามรูปแบบบัญญัติ ฉันจะทราบว่าหากคุณคิดว่าคุณอาจต้องการอาร์กิวเมนต์หรือส่งคืนค่าในอนาคตให้สร้างข้อความใหม่ที่ไม่มีฟิลด์ ด้วยวิธีนี้คุณสามารถเพิ่มฟิลด์ใหม่เมื่อคุณต้องการและไม่ทำลายรหัสแอปพลิเคชันใด ๆ Empty เหมาะสำหรับเวลาที่คุณไม่ต้องการอาร์กิวเมนต์หรือส่งคืนค่า
Eric Anderson

40
@EricAnderson พูดถูกเป็นส่วนใหญ่ แต่ฉันจะเถียงว่าเราในฐานะนักพัฒนานั้นเดาไม่ถูกว่าเราอาจต้องการอะไรในอนาคต ดังนั้นฉันขอแนะนำให้ปลอดภัยโดยการกำหนดพารามิเตอร์และประเภทผลลัพธ์ที่กำหนดเองสำหรับทุกวิธีเสมอแม้ว่าจะว่างเปล่าก็ตาม
Kenton Varda

1
"... เราในฐานะนักพัฒนานั้นเดาไม่ถูกว่าเราอาจต้องการอะไรในอนาคต", นี่จะต้องมีEmptyข้อความแยกกันสำหรับการเรียกใช้ฟังก์ชันแต่ละรายการหรือไม่? นั่นเป็นการเสียสละมาก
Robert de W

30

คุณยังสามารถใช้ที่กำหนดไว้ล่วงหน้า:

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

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

0

คุณยังสามารถใช้คุณสมบัติบูลอื่นในโครงสร้างการตอบกลับ แบบนี้

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

ดังนั้นหากคุณไม่พบผลลัพธ์หรือมีข้อผิดพลาดเกิดขึ้นคุณสามารถกลับจากคลาสบริการนี้ได้

return new Reply()
{
   Found = false
};
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.