Frage

Ich bin Refactoring legacy C ++ System SOA mit gSOAP. Wir haben einige Performance-Probleme (sehr große XMLs) so meine Führung mich gebeten, einen Blick auf Protokoll-Puffer zu nehmen. Ich habe, und es sieht sehr cool (Wir brauchen C ++ und Java-Unterstützung). Allerdings Protokollpuffer sind Lösung nur für die Serialisierung und jetzt muss ich es Java-Frontend senden. Was soll ich von C ++ verwenden und Java-Perspektive jener serialisierten Sachen über HTTP senden (nur internes Netzwerk)?

PS. Ein weiterer Mann versucht, unsere gSOAP Lösung zu beschleunigen, ich habe Interesse an Protokoll-Puffer nur.

War es hilfreich?

Lösung

Sie können sicherlich auch eine binäre Nutzlast mit einer HTTP-Anforderung oder in einer HTTP-Antwort senden. Schreiben Sie einfach das Bytes des Protokollpuffers direkt in den Request / Response, und stellen Sie sicher, dass der Inhaltstyp „application / octet-stream“ setzen. Der Client und Server, sollte in der Lage sein, leicht zu kümmern sich um den Rest. Ich glaube nicht, dass Sie nichts mehr Besonderes benötigen als die an beiden Enden.

Andere Tipps

protobuf ist ein binäres Protokoll. Es ist gut mischen nicht mit SOAP. Ich schlage vor, Sie entweder Stick mit gSOAP oder konvertieren ganz protobuf.

Mit protobuf definieren Sie Ihr Protokoll in einem speziellen Format wie diese,

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

Das protoc Tool kann Code in C ++ / Java / Python erzeugen, so dass Sie es an einem Ende und Deserialisieren auf einem anderen Serialisierung können.

Wie Sie sehen können, ist protobuf gestaltet einzelnes Objekt serialisiert werden. Es bietet nicht alle Einrichtungen von SOAP zur Verfügung gestellt, wie Header. Um dieses Problem zu erhalten, verwenden wir protobuf innen protobuf. Wir definieren einen Umschlag wie diese,

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;
}

Die encodedMessage ist eine weitere serialisierten protobuf Nachricht. All das Zeug in SOAP-Header geht nun an headers.

Google-Frontends bevorzugen application/protobuf.

Die ProtocolBufferModel die Google API-Client verwendet application/x-protobuf.

Sie können serialisiert / de-serialize protobuf codierte Daten zu / von Strings. Senden Sie die serialisierten String als Körper eines HTTP-POST zu Java und de-serialisiert es. Das ist ein Ansatz. Eine weitere Möglichkeit ist die Verwendung der protobuf Service-Schnittstelle zu machen. Protobuf kann Ihnen eine Service-Schnittstelle in einer Proto-Datei und der Protokollpuffer Compiler definieren Service-Interface-Code und Stubs in der gewählten Sprache erzeugen. Sie müssen nur die protobuf :: RpcChannel und protobuf :: RpcController Klassen implementieren einen vollständigen RPC Rahmen zu erhalten. Wahrscheinlich können Sie einen HTTP-Wrapper für diese Klassen schreiben. Auch die folgenden Links für weitere Informationen:

http://code.google.com/apis/protocolbuffers/ docs / proto.html # Dienstleistungen 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

Mein Wissen Protokollpuffer Unterstützung ist sowohl in C ++ und Java zur Verfügung, sollten Sie in der Lage sein, um Protokollpuffer serialisierten Daten zwischen beiden Systemen austauschen.

Wie gesagt, so scheint es, Ihre Frage ist

„Wie kann ich Sachen über HTTP zwischen einem C ++ Backend und Java-Client senden“

Es klingt wie Sie lernen müssen, wie gSOAP zu verwenden, lesen Sie die docs .

Alternativ können Sie einen RESTful Web-Server von Ihrem C ++ App Gastgeber: Betrachten Sie diese: https://stackoverflow.com/questions/298113/how-can-i-implement-a-restful-webservice-using-c++

Als nächst Sie die Daten auf den neuen C ++ RESTful-Server gehostet zugreifen müßten: Sehen Sie: Erholung Clients für Java?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top