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定义数组。

回到顶部