背景
- 文中以protobuf的example提供的文件为例。
// See README.txt for information and build instructions. // // Note: START and END tags are used in comments to define sections used in // tutorials. They are not part of the syntax for Protocol Buffers. // // To get an in-depth walkthrough of this file and the related examples, see: // https://developers.google.com/protocol-buffers/docs/tutorials // [START declaration] syntax = "proto3"; package tutorial; import "google/protobuf/timestamp.proto"; // [END declaration] // [START java_declaration] option java_multiple_files = true; option java_package = "com.example.tutorial.protos"; option java_outer_classname = "AddressBookProtos"; // [END java_declaration] // [START csharp_declaration] option csharp_namespace = "Google.Protobuf.Examples.AddressBook"; // [END csharp_declaration] // [START go_declaration] option go_package = "../tutorial"; // [END go_declaration] // [START messages] message Person { string name = 1; int32 id = 2; // Unique ID number for this person. string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { string number = 1; PhoneType type = 2; } repeated PhoneNumber phones = 4; google.protobuf.Timestamp last_updated = 5; } // Our address book file is just one of these. message AddressBook { repeated Person people = 1; } // [END messages]
- 根据.proto文件,生成Python用文件。(系统安装protobug之后,执行protoc --python_out=./ ./addressbook.proto,自动生成addressbook_pb2.py)
开发过程
- 文件引入
正常包引入(import addressbook_pb2)。如果需要动态引入,可以将addressbook_pb2.py文件内容存在字符串中,使用__import__引入。
- 生成post body数据
addressbook= addressbook_pb2.AddressBook()
persion = addressbook.Person
persion.name = "test"
persion.email = "test@test.com"
payload=addressbook.SerializeToString()
- 设置header
headers = {
'Content-Type': 'application/x-protobuf'
}
- 发送请求,反序列化结果
response = requests.request("POST", url, headers=headers, data=payload)
res_response = addressbook_pb2.AddressBook()
res_response.ParseFromString(response.content)
dict_list = []
for r in res_response.Person:
dict_list.append(MessageToDict(r))
print(dict_list )