質問

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用クライアント?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top