Buffer di protocollo di Google e HTTP
-
07-07-2019 - |
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.
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?