Python 用protobuf对flask API来进行序列化和反序列化
import flask import json server=flask.Flask("abc") @server.route("/user/list",methods=["get"]) def user_list(): json_dict={ "code": 0, "msg": "操作成功", "data": { "id": 8877, "create_time": "2023-12-01 22:08:57", "update_time": "2023-12-01 22:08:57", "phone": "1550000000", "email": "3332@qq.com", "nick": "wuhh", "roles": [], "head_url": "http://test/api/default.jpg" } } return json.dumps(json_dict) server.run(debug=True,port=8888)
syntax="proto3"; package user_proto; message UserData { int32 id=1; string create_time = 2; string update_time = 3; string phone = 4; string email = 5; string nick = 6; repeated string roles = 7; string head_url = 8; } message UserResponse { int32 code = 1; string msg = 2; UserData data = 3; }
protoc --python_out=. user.proto
from flask import Flask, Response import json import user_pb2 server=Flask("abc") @server.route("/user/list",methods=["get"]) def user_list(): json_dict={ "code": 0, "msg": "操作成功", "data": { "id": 8877, "create_time": "2023-12-01 22:08:57", "update_time": "2023-12-01 22:08:57", "phone": "1550000000", "email": "3332@qq.com", "nick": "wuhh", "roles": [], "head_url": "http://test/api/default.jpg" } } # 创建 protobuf 消息实例并填充数据 user_data=user_pb2.UserData() user_data.id=8877 user_data.create_time="2023-12-01 22:08:57" user_data.update_time="2023-12-01 22:08:57" user_data.phone="1550000000" user_data.email="3332@qq.com" user_data.nick="wuhh" role_list=[12,34] user_data.roles.append(str(role_list)) user_data.head_url="http://test/api/default.jpg" response=user_pb2.UserResponse() response.code=0 response.msg = "操作成功"; response.data.CopyFrom(user_data); # 序列化protobuf消息为字节串 serialized_response=response.SerializeToString() # 创建一个Flask响应,设置内容类型和正文 return Response(serialized_response,mimetype='application/octet-stream') server.run(debug=True,port=8888)
import requests
import user_pb2
from google.protobuf.json_format import MessageToJson
req=requests.request(method="get",url="http://127.0.0.1:8888/user/list",headers={"Content-Type":"application/octet-stream"})
protobuf_data =req.content # 从接口接收到的 protobuf 序列化数据
# print(protobuf_data)
def deserialize_protobuf_data(protobuf_data):
# protobuf_data 是从某个接口接收到的 protobuf 序列化后的字节串
message = user_pb2.UserResponse() # 替换为你在 .proto 文件中定义的消息类型
message.ParseFromString(protobuf_data) # 从字节串中反序列化数据
return message
person = deserialize_protobuf_data(protobuf_data)
json_data=MessageToJson(person)
print(json_data)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义