谷歌协议缓冲区和HTTP

2022-09-01 00:21:59

我正在使用gSoap将遗留C++系统重构为SOA。我们有一些性能问题(非常大的XML),所以我的领导要求我看看协议缓冲区。我做到了,它看起来很酷(我们需要C++和Java支持)。但是,协议缓冲区是仅用于序列化的解决方案,现在我需要将其发送到Java前端。从C++和Java的角度来看,我应该使用什么来通过HTTP(只是内部网络)发送这些序列化的东西?

另一个人试图加速我们的gSoap解决方案,我只对协议缓冲区感兴趣。


答案 1

您当然甚至可以使用HTTP请求或在HTTP响应中发送二进制有效负载。只需将协议缓冲区的字节直接写入请求/响应,并确保将内容类型设置为“应用程序/八位字节流”。客户端和服务器应该能够轻松处理其余工作。我不认为你需要任何比这更特别的东西。


答案 2

ProtoBuf是一个二进制协议。它与 SOAP 不能很好地混合。我建议你要么坚持使用gSOAP,要么完全转换为ProtoBuf。

使用protoBuf,您可以以这样的特殊格式定义协议,

message Product {
  required string id = 1;
  required string description = 2;
  required int32 quantity = 3;
  optional bool discontinued = 4;
}

该工具可以在C++/Java/Python中生成代码,因此您可以在一端序列化它,在另一端反序列化。protoc

如您所见,ProtoBuf 旨在序列化单个对象。它不提供 SOAP 提供的所有功能,如标头。为了解决这个问题,我们在ProtoBuf中使用ProtoBuf。我们这样定义一个信封,

message Envelope {
  enum Type { 
    SEARCH = 1;
    SEARCH_RESPONSE = 2;
    RETRIEVE = 3;
    RETRIEVE_RESPONSE = 4; 
  }
  required Type type = 1;

  required bytes encodedMessage = 2;

  message Header {
    required string key = 1;
    required bytes value = 2;
  }    
  repeated Header headers = 3;
}

这是另一个序列化的 ProtoBuf 消息。SOAP 标头中的所有内容现在都转到 。encodedMessageheaders


推荐