2017-04-02 14 views
5

Tôi có giản đồ sau đây trong tập tin .proto tôi:Làm thế nào để trả lại một mảng trong Protobuf rpc dịch vụ

service MyService { 
    rpc GetItem (ItemQuery) returns (Item) { 
    } 
} 

message ItemQuery { 
    int id = 1; 
} 
message Item { 
    int id = 1; 
    string name = 2; 
} 

Bây giờ tôi muốn thêm một phương pháp rpc để trả lại nhiều mục. Một cái gì đó như thế này:

rpc GetItems (ItemsQuery) returns (repeated Item) { 
} 

Có cách nào tốt hơn để làm điều đó hơn là xác định thư mục?

Trả lời

10

Lựa chọn 1 - Sử dụng dòng:

rpc GetItems (ItemsQuery) returns (stream Item) { 
} 

Lựa chọn 2 - Thiết lập một thông điệp phản ứng mà sẽ sử dụng một đối tượng lặp đi lặp lại:

service MyService { 
    rpc GetItem (ItemQuery) returns (ItemResponse) { 
    } 
} 

message ItemQuery { 
    int id = 1; 
} 
message ItemResponse { 
    repeated Item items = 1; 
} 
message Item { 
    int id = 1; 
    string name = 2; 
} 
+0

tôi đến trễ cho bữa tiệc, nhưng: Liệu phương án 2 có bất kỳ lợi thế nào trên tùy chọn 1 hoặc ngược lại không? – LuMa

+1

Tùy chọn 1 là một luồng, điều đó có nghĩa là bạn đang trả về một trình lặp và điều đó có nghĩa là bạn có thể bắt đầu xử lý các mục trên máy khách ngay cả trước khi máy chủ gửi xong tất cả chúng. Tùy chọn 2 là một đối tượng phản hồi có chứa một danh sách các mục của bạn. Bạn có thể thêm một số thuộc tính khác vào ItemResponse của bạn (một số siêu dữ liệu, v.v.) ... – Shoham

Các vấn đề liên quan