GoogleプロトコルバッファーとHTTP
-
07-07-2019 - |
質問
gSoapを使用して、レガシーC ++システムをSOAにリファクタリングしています。いくつかのパフォーマンスの問題(非常に大きなXML)があるため、リードからプロトコルバッファーを確認するように依頼されました。私はそうしましたが、とてもクールに見えます(C ++とJavaのサポートが必要です)。ただし、プロトコルバッファーはシリアル化のためのソリューションであり、Javaフロントエンドに送信する必要があります。これらのシリアル化されたものをHTTP(単なる内部ネットワーク)経由で送信するには、C ++およびJavaの観点から何を使用すればよいですか?
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
を好みます。
ProtocolBufferModel Google APIクライアントは application / x-protobuf
を使用します。
protobufでエンコードされたデータを文字列との間でシリアル化/逆シリアル化できます。シリアル化された文字列をHTTP POSTの本文としてJavaに送信し、シリアル化を解除します。それが一つのアプローチです。別の方法は、protobufサービスインターフェイスを使用することです。 Protobufを使用すると、.protoファイルでサービスインターフェイスを定義でき、プロトコルバッファーコンパイラは選択した言語でサービスインターフェイスコードとスタブを生成します。完全なRPCフレームワークを取得するには、protobuf :: RpcChannelクラスとprotobuf :: RpcControllerクラスを実装するだけです。おそらく、これらのクラスの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
私の知る限り、プロトコルバッファのサポートは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 Java用クライアント?