Tôi có thể xác định cuộc gọi grpc với một yêu cầu hoặc phản hồi rỗng không?


117

Cú pháp rpc trong proto3 có cho phép các yêu cầu hoặc phản hồi rỗng không?

ví dụ: tôi muốn tương đương như sau:

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

Hay tôi chỉ nên tạo một kiểu null?

message Null {};

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

Câu trả lời:


164

Bình luận của Kenton dưới đây là lời khuyên hợp lý:

... chúng tôi với tư cách là nhà phát triển thực sự kém trong việc đoán những gì chúng tôi có thể muốn trong tương lai. Vì vậy, tôi khuyên bạn nên an toàn bằng cách luôn xác định các tham số và loại kết quả tùy chỉnh cho mọi phương pháp, ngay cả khi chúng trống.


Trả lời câu hỏi của riêng tôi:

Xem qua các tệp proto mặc định, tôi bắt gặp Empty giống hệt như kiểu Null mà tôi đã đề xuất ở trên :)

đoạn trích từ tệp đó:

// 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
Đúng. Rỗng là yêu cầu hoặc phản hồi "Tôi không quan tâm" chuẩn. Tôi sẽ lưu ý, nếu bạn nghĩ rằng bạn có thể muốn đối số hoặc trả về giá trị trong tương lai, hãy tạo một thông báo mới đơn giản là không có trường. Bằng cách đó, bạn có thể thêm các trường mới khi cần và không làm hỏng bất kỳ mã ứng dụng nào. Rỗng là tuyệt vời khi bạn sẽ không bao giờ muốn đối số hoặc giá trị trả về.
Eric Anderson

40
@EricAnderson phần lớn đúng, nhưng tôi cho rằng chúng tôi với tư cách là nhà phát triển thực sự kém trong việc đoán những gì chúng tôi có thể muốn trong tương lai. Vì vậy, tôi khuyên bạn nên an toàn bằng cách luôn xác định các tham số và loại kết quả tùy chỉnh cho mọi phương pháp, ngay cả khi chúng trống.
Kenton Varda

1
"... chúng tôi với tư cách là các nhà phát triển thực sự rất tệ trong việc đoán những gì chúng tôi có thể muốn trong tương lai.", Điều này sẽ yêu cầu một Emptythông báo riêng biệt cho từng lệnh gọi hàm riêng lẻ? Đó là một sự hy sinh.
Robert de W

29

Bạn cũng có thể sử dụng được xác định trước:

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

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

0

bạn cũng có thể sử dụng một thuộc tính bool khác bên trong cấu trúc Reply. như thế này

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

vì vậy nếu bạn không tìm thấy kết quả hoặc một số lỗi đã xảy ra, bạn có thể trả về từ lớp dịch vụ này

return new Reply()
{
   Found = false
};
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.