従来のC++システムをgSoapを使用してSOAにリファクタリングしています。パフォーマンスの問題(非常に大きなXML)があるため、リードからプロトコルバッファーを確認するように依頼されました。非常にクールです(C++とJavaのサポートが必要です)。ただし、プロトコルバッファはシリアル化のためのソリューションであり、今ではJavaフロントエンドに送信する必要があります。 C++とJavaの観点から、HTTP(内部ネットワークのみ)でこれらのシリアル化されたものを送信するには何を使用すればよいですか?
PS。別の男がgSoapソリューションの高速化を試みています。私はプロトコルバッファーのみに興味があります。
HTTPリクエストまたはHTTPレスポンスでバイナリペイロードを送信することもできます。プロトコルバッファのバイトを要求/応答に直接書き込み、コンテンツタイプを「application/octet-stream」に設定してください。クライアントとサーバーは、残りを簡単に処理できる必要があります。どちらかというと特別なものは必要ないと思います。
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
に移動します。
Googleフロントエンドはapplication/protobuf
を好みます。
Google APIクライアントの ProtocolBufferModel はapplication/x-protobuf
を使用します。
Protobufでエンコードされたデータを文字列との間でシリアル化/逆シリアル化できます。 HTTP POST to Javaにシリアル化された文字列を送信し、それを逆シリアル化します。これは1つのアプローチです。別の方法は、 protobufサービスインターフェイス:protobufを使用すると、.protoファイルでサービスインターフェイスを定義でき、プロトコルバッファーコンパイラは、選択した言語でサービスインターフェイスコードとスタブを生成します。完全なRPCフレームワークを取得するには、おそらくこれらのクラスのHTTPラッパーを作成できます。詳細については、次のリンクを参照してください。
http://code.google.com/apis/protocolbuffers/docs/proto.html#serviceshttp://code.google.com/apis/protocolbuffers/docs/reference/ cpp-generated.html#servicehttp://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.service.html
私の知る限り、プロトコルバッファのサポートはC++とJavaの両方で利用でき、両方のシステム間でプロトコルバッファのシリアル化されたデータを交換できるはずです。
とはいえ、あなたの本当の質問は「C++バックエンドとJavaクライアント」との間でHTTP経由でデータを送信するにはどうすればよいか」
GSOAPの使用方法を学ぶ必要があるように聞こえます。 docs を読んでください。
または、C++アプリからRESTful Webサーバーをホストすることもできます。これを見てください。 https://stackoverflow.com/questions/298113/how-can-i-implement-a-restful-webservice-using-c++
次に、新しいC++ RESTfulサーバーでホストされているデータにアクセスする必要があります。これを見てください。 JavaのRESTクライアント?