Question

Je suis en train de refactoriser l'ancien système C ++ en SOA à l'aide de gSoap. Nous avons des problèmes de performances (très gros XML) et mon responsable m'a donc demandé d'examiner les tampons de protocole. Je l’ai fait, et c’est très cool (nous avons besoin du support de C ++ et de Java). Cependant, les tampons de protocole ne sont qu'une solution pour la sérialisation et je dois maintenant l'envoyer à l'interface Java front-end. Que dois-je utiliser de la perspective C ++ et Java pour envoyer ces éléments sérialisés sur HTTP (réseau interne uniquement)?

PS. Un autre gars tente d’accélérer notre solution gSoap, les tampons de protocole ne m’intéressent que.

Était-ce utile?

La solution

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

Autres conseils

ProtoBuf est un protocole binaire. Cela ne se mélange pas bien avec le savon. Je vous suggère de vous en tenir à gSOAP ou de convertir entièrement 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 le désérialiser à une autre.

Comme vous pouvez le constater, ProtoBuf est conçu pour sérialiser un objet individuel. Il ne fournit pas toutes les installations fournies par SOAP, comme les en-têtes. Pour résoudre 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;
}

Le encodedMessage est un autre message ProtoBuf sérialisé. Tous les éléments de l'en-tête SOAP vont maintenant dans en-têtes .

Les interfaces Google préfèrent application / protobuf .

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

Vous pouvez sérialiser / désérialiser les données encodées par protobuf en / à partir de chaînes. Envoyez la chaîne sérialisée en tant que corps d'un HTTP POST à ??Java et désérialisez-la. C'est une approche. Une autre méthode consiste à utiliser l'interface de service protobuf. Protobuf vous permet de définir une interface de service dans un fichier .proto. Le compilateur de mémoire tampon de protocole générera le code d'interface de service et les stubs dans la langue de votre choix. Il vous suffit d'implémenter les classes protobuf :: RpcChannel et protobuf :: RpcController pour obtenir un framework RPC complet. 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 # 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

À 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 la mémoire tampon de protocole entre les deux systèmes.

Cela dit, il semble que votre vraie question soit "Comment envoyer des éléments via HTTP entre un backend C ++ et un client Java"

Il semblerait que vous deviez apprendre à utiliser gSOAP, lisez le docs .

Sinon, vous pouvez 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: voici ce que vous en trouverez: Rest clients pour Java?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top