web-dev-qa-db-ja.com

GoogleプロトコルバッファーとHTTP

従来のC++システムをgSoapを使用してSOAにリファクタリングしています。パフォーマンスの問題(非常に大きなXML)があるため、リードからプロトコルバッファーを確認するように依頼されました。非常にクールです(C++とJavaのサポートが必要です)。ただし、プロトコルバッファはシリアル化のためのソリューションであり、今ではJavaフロントエンドに送信する必要があります。 C++とJavaの観点から、HTTP(内部ネットワークのみ)でこれらのシリアル化されたものを送信するには何を使用すればよいですか?

PS。別の男がgSoapソリューションの高速化を試みています。私はプロトコルバッファーのみに興味があります。

38
Nazgob

HTTPリクエストまたはHTTPレスポンスでバイナリペイロードを送信することもできます。プロトコルバッファのバイトを要求/応答に直接書き込み、コンテンツタイプを「application/octet-stream」に設定してください。クライアントとサーバーは、残りを簡単に処理できる必要があります。どちらかというと特別なものは必要ないと思います。

59
Sean Owen

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に移動します。

24
ZZ Coder

Googleフロントエンドはapplication/protobufを好みます。

Google APIクライアントの ProtocolBufferModelapplication/x-protobufを使用します。

6
rds

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

5
Vijay Mathew

私の知る限り、プロトコルバッファのサポートは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クライアント?

2
Matthew