Domanda

Sto eseguendo il refactoring del sistema C ++ legacy su SOA usando gSoap. Abbiamo alcuni problemi di prestazioni (XML molto grandi), quindi il mio lead mi ha chiesto di dare un'occhiata ai buffer di protocollo. L'ho fatto e sembra molto bello (abbiamo bisogno del supporto C ++ e Java). Tuttavia i buffer di protocollo sono una soluzione solo per la serializzazione e ora devo inviarlo al front-end Java. Cosa dovrei usare dal punto di vista C ++ e Java per inviare quelle cose serializzate su HTTP (solo rete interna)?

PS. Un altro ragazzo cerca di accelerare la nostra soluzione gSoap, sono interessato solo ai buffer di protocollo.

È stato utile?

Soluzione

Puoi certamente inviare anche un payload binario con una richiesta HTTP o in una risposta HTTP. Basta scrivere i byte del buffer di protocollo direttamente nella richiesta / risposta e assicurarsi di impostare il tipo di contenuto su "application / octet-stream". Il client e il server dovrebbero essere in grado di occuparsi facilmente del resto. Non credo che tu abbia bisogno di qualcosa di più speciale di quello alle due estremità.

Altri suggerimenti

ProtoBuf è un protocollo binario. Non si combina bene con SOAP. Suggerisco di attenersi a gSOAP o di convertirlo interamente in ProtoBuf.

Con protoBuf, definisci il tuo protocollo in un formato speciale come questo,

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

Lo strumento protoc può generare codice in C ++ / Java / Python in modo da poterlo serializzare da un lato e deserializzare da un altro.

Come puoi vedere, ProtoBuf è progettato per serializzare singoli oggetti. Non fornisce tutti i servizi forniti da SOAP, come le intestazioni. Per aggirare questo problema, utilizziamo ProtoBuf all'interno di ProtoBuf. Definiamo una busta come questa,

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 è un altro messaggio ProtoBuf serializzato. Tutte le cose nell'intestazione SOAP ora vanno in header .

I front-end di Google preferiscono application / protobuf .

Il ProtocolBufferModel di il client dell'API di Google utilizza application / x-protobuf .

È possibile serializzare / deserializzare i dati codificati protobuf da / verso stringhe. Invia la stringa serializzata come corpo di un POST HTTP a Java e deselezionala. Questo è un approccio. Un altro modo è quello di utilizzare l'interfaccia del servizio protobuf. Protobuf consente di definire un'interfaccia di servizio in un file .proto e il compilatore del buffer di protocollo genererà il codice dell'interfaccia di servizio e gli stub nella lingua scelta. Per ottenere un framework RPC completo, è sufficiente implementare le classi protobuf :: RpcChannel e protobuf :: RpcController. Probabilmente puoi scrivere un wrapper HTTP per queste classi. Vedere i seguenti collegamenti per ulteriori informazioni:

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

Per quanto ne so, il supporto dei buffer dei protocolli è disponibile sia in C ++ che in Java, dovresti essere in grado di scambiare dati serializzati nel buffer di protocollo tra i due sistemi.

Detto questo, sembra che la tua vera domanda sia " Come posso inviare cose su HTTP tra un backend C ++ e un client Java "

Sembra che tu abbia bisogno di imparare come usare gSOAP, leggi docs .

In alternativa potresti ospitare un server web RESTful dalla tua app C ++: guarda questo: https://stackoverflow.com/questions/298113/how-can-i-implement-a-restful-webservice-using-c++

Successivamente dovrai accedere ai dati ospitati sul tuo nuovo server RESTful C ++: guarda qui: Rest client per Java?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top