web-dev-qa-db-fra.com

Tampons de protocole Google et HTTP

Je refactorise le système C++ hérité en SOA en utilisant gSoap. Nous avons des problèmes de performances (très gros XML) donc mon responsable m'a demandé de jeter un œil aux tampons de protocole. Je l'ai fait, et il semble très cool (Nous avons besoin de C++ et Java). Cependant, les tampons de protocole sont une solution juste pour la sérialisation et maintenant je dois l'envoyer à Java front-end. Que dois-je utiliser depuis C++ et Java perspective pour envoyer ces trucs sérialisés sur HTTP (juste réseau interne)?

PS. Un autre gars essaie d'accélérer notre solution gSoap, je ne m'intéresse qu'aux tampons de protocole.

38
Nazgob

Vous pouvez certainement envoyer même une charge utile binaire avec une requête HTTP ou dans une réponse HTTP. Écrivez simplement les octets du tampon de protocole directement dans la demande/réponse et assurez-vous de définir le type de contenu sur "application/octet-stream". Le client et le serveur devraient pouvoir s'occuper facilement du reste. Je ne pense pas que vous ayez besoin de quelque chose de plus spécial que cela à chaque extrémité.

59
Sean Owen

ProtoBuf est un protocole binaire. Il ne se mélange pas bien avec du savon. Je vous suggère de rester avec gSOAP ou de convertir entièrement en ProtoBuf.

Avec protoBuf, vous définissez votre protocole dans un format spécial comme celui-ci,

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

L'outil protoc peut générer du code en C++/Java/Python afin que vous puissiez le sérialiser à une extrémité et désérialiser à une autre.

Comme vous pouvez le voir, ProtoBuf est conçu pour sérialiser un objet individuel. Il ne fournit pas toutes les fonctionnalités fournies par SOAP, comme les en-têtes. Pour contourner ce problème, nous utilisons ProtoBuf dans ProtoBuf. Nous définissons une enveloppe comme celle-ci,

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 est un autre message ProtoBuf sérialisé. Tous les éléments de l'en-tête SOAP vont maintenant à headers.

24
ZZ Coder

Les frontends de Google préfèrent application/protobuf.

Le ProtocolBufferModel du client API Google utilise application/x-protobuf.

6
rds

Vous pouvez sérialiser/désérialiser des données codées protobuf vers/depuis des chaînes. Envoyez la chaîne sérialisée en tant que corps d'un HTTP POST to Java et désérialisez-le. C'est une approche. Une autre façon consiste à utiliser le interface de service protobuf. Protobuf vous permet de définir une interface de service dans un fichier .proto et le compilateur de tampon de protocole générera le code d'interface de service et les stubs dans la langue de votre choix. Vous n'avez qu'à implémenter les classes protobuf :: RpcChannel et protobuf :: RpcController pour obtenir une infrastructure RPC complète. Vous pouvez probablement écrire un wrapper HTTP pour ces classes. Consultez les liens suivants pour plus d'informations:

http://code.google.com/apis/protocolbuffers/docs/proto.html#serviceshttp://code.google.com/apis/protocolbuffers/docs/reference/ service généré par cpp.html #http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.service.html

5
Vijay Mathew

À ma connaissance, la prise en charge des tampons de protocole est disponible à la fois en C++ et en Java, vous devriez pouvoir échanger des données sérialisées de tampon de protocole entre les deux systèmes.

Cela dit, il semble que votre vraie question soit "Comment envoyer des trucs sur HTTP entre un backend C++ et Java client"

Il semble que vous ayez besoin d'apprendre à utiliser gSOAP, lisez docs .

Vous pouvez également héberger un serveur Web RESTful à partir de votre application C++: regardez ceci: https://stackoverflow.com/questions/298113/how-can-i-implement-a-restful-webservice-using-c++

Ensuite, vous devrez accéder aux données hébergées sur votre nouveau serveur C++ RESTful: Regardez ceci: Rest clients pour Java?

2
Matthew