Python中如何用gRPC返回包含字典的数组
proto 里用了 repeated string message = 1 ; 用来传数组。但是这只限定去数组里的元素都是字符,如果我数组的元素都是字典就会报错,提示类型不对,我能想到以下两者方法,但还有什么好方法能一次性返回的?
1,把 List 里的所有元素都 str()一下 2,用 reponse-streaming,一个个字典元素返回
Python中如何用gRPC返回包含字典的数组
1 回复
# 首先定义protobuf消息类型,在.proto文件中:
# message DictItem {
# map<string, string> data = 1;
# }
#
# message DictArrayResponse {
# repeated DictItem items = 1;
# }
import grpc
from concurrent import futures
import dict_service_pb2
import dict_service_pb2_grpc
class DictService(dict_service_pb2_grpc.DictServiceServicer):
def GetDictArray(self, request, context):
# 创建包含字典数组的响应
response = dict_service_pb2.DictArrayResponse()
# 添加第一个字典
item1 = response.items.add()
item1.data["name"] = "Alice"
item1.data["age"] = "30"
item1.data["city"] = "New York"
# 添加第二个字典
item2 = response.items.add()
item2.data["name"] = "Bob"
item2.data["age"] = "25"
item2.data["job"] = "Engineer"
# 添加第三个字典(动态生成)
item3 = response.items.add()
dynamic_data = {"status": "active", "score": "95"}
for key, value in dynamic_data.items():
item3.data[key] = value
return response
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
dict_service_pb2_grpc.add_DictServiceServicer_to_server(DictService(), server)
server.add_insecure_port('[::]:50051')
server.start()
server.wait_for_termination()
if __name__ == '__main__':
serve()
客户端调用代码:
import grpc
import dict_service_pb2
import dict_service_pb2_grpc
def run():
channel = grpc.insecure_channel('localhost:50051')
stub = dict_service_pb2_grpc.DictServiceStub(channel)
response = stub.GetDictArray(dict_service_pb2.Empty())
for i, item in enumerate(response.items):
print(f"Item {i + 1}:")
for key, value in item.data.items():
print(f" {key}: {value}")
if __name__ == '__main__':
run()
关键点:在protobuf中用map<string, string>定义字典,用repeated定义数组,服务端填充数据后直接返回即可。
总结:用map定义字典,repeated定义数组。

