45

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

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

4

5 回答 5

67

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

于 2009-09-15T08:53:23.923 回答
25

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

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

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

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

如您所见,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;
}

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

于 2009-09-15T14:37:59.173 回答
10

谷歌前端更喜欢application/protobuf.

Google API 客户端的ProtocolBufferModel使用application/x-protobuf.

于 2015-06-05T15:45:12.117 回答
7

您可以将 protobuf 编码数据序列化/反序列化到/从字符串中。将序列化的字符串作为 HTTP POST 的主体发送到 Java 并对其进行反序列化。这是一种方法。另一种方法是使用 protobuf Service 接口。Protobuf 允许您在 .proto 文件中定义服务接口,并且协议缓冲区编译器将以您选择的语言生成服务接口代码和存根。你只需要实现 protobuf::RpcChannel 和 protobuf::RpcController 类就可以得到一个完整的 RPC 框架。或许您可以为这些类编写一个 HTTP 包装器。有关更多信息,请参阅以下链接:

http://code.google.com/apis/protocolbuffers/docs/proto.html#services http://code.google.com/apis/protocolbuffers/docs/reference/cpp-generated.html#service http:// code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.service.html

于 2009-09-15T09:22:23.693 回答
2

据我所知,C++ 和 Java 都支持协议缓冲区,您应该能够在两个系统之间交换协议缓冲区序列化数据。

也就是说,您真正的问题似乎是“如何在 C++ 后端和 Java 客户端之间通过 HTTP 发送内容”

听起来您需要学习如何使用 gSOAP,阅读文档

或者,您可以从您的 C++ 应用程序托管一个 RESTful Web 服务器:看看这个:https ://stackoverflow.com/questions/298113/how-can-i-implement-a-restful-webservice-using-c++

接下来,您需要访问托管在您的新 C++ RESTful 服务器上的数据:看这个:Rest clients for Java?

于 2009-09-15T08:58:12.143 回答