Pregunta

Estoy refactorizando el sistema C ++ heredado a SOA usando gSoap. Tenemos algunos problemas de rendimiento (XML muy grandes), por lo que mi líder me pidió que echara un vistazo a los buffers de protocolo. Lo hice, y se ve muy bien (necesitamos compatibilidad con C ++ y Java). Sin embargo, los buffers de protocolo son una solución solo para la serialización y ahora necesito enviarlo al front-end de Java. ¿Qué debo usar desde la perspectiva de C ++ y Java para enviar esas cosas serializadas a través de HTTP (solo red interna)?

PS. Otro tipo intenta acelerar nuestra solución gSoap, solo estoy interesado en los buffers de protocolo.

¿Fue útil?

Solución

Ciertamente puede enviar incluso una carga útil binaria con una solicitud HTTP, o en una respuesta HTTP. Simplemente escriba los bytes del búfer de protocolo directamente en la solicitud / respuesta, y asegúrese de establecer el tipo de contenido en "application / octet-stream". El cliente y el servidor deberían poder encargarse del resto fácilmente. No creo que necesites nada más especial que eso en ninguno de los extremos.

Otros consejos

ProtoBuf es un protocolo binario. No se mezcla bien con SOAP. Le sugiero que se quede con gSOAP o que lo convierta a ProtoBuf por completo.

Con protoBuf, usted define su protocolo en un formato especial como este,

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

La herramienta protocol puede generar código en C ++ / Java / Python para que pueda serializarlo en un extremo y deserializarlo en el otro.

Como puede ver, ProtoBuf está diseñado para serializar objetos individuales. No proporciona todas las facilidades proporcionadas por SOAP, como los encabezados. Para solucionar este problema, usamos ProtoBuf dentro de ProtoBuf. Definimos un Sobre como este,

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

El encodedMessage es otro mensaje serializado de ProtoBuf. Todas las cosas en el encabezado SOAP ahora van a encabezados .

Las interfaces de Google prefieren application / protobuf .

El ProtocolBufferModel de el cliente API de Google utiliza application / x-protobuf .

Puede serializar / deserializar datos codificados de protobuf a / desde cadenas. Envíe la cadena serializada como el cuerpo de una POST HTTP a Java y deserialícela. Ese es un enfoque. Otra forma es hacer uso de la interfaz del servicio protobuf. Protobuf le permite definir una interfaz de servicio en un archivo .proto y el compilador de búfer de protocolo generará código de interfaz de servicio y apéndices en el idioma elegido. Solo necesita implementar las clases protobuf :: RpcChannel y protobuf :: RpcController para obtener un marco RPC completo. Probablemente pueda escribir un contenedor HTTP para estas clases. Consulte los siguientes enlaces para obtener más información:

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

Que yo sepa, el soporte de los buffers de protocolo está disponible tanto en C ++ como en Java, debería poder intercambiar datos serializados de buffer de protocolo entre ambos sistemas.

Dicho esto, parece que su verdadera pregunta es "¿Cómo envío cosas a través de HTTP entre un servidor de C ++ y un cliente Java?"

Parece que necesita aprender a usar gSOAP, lea los documentos .

Alternativamente, podría alojar un servidor web RESTful desde su aplicación C ++: Mire esto: https://stackoverflow.com/questions/298113/how-can-i-implement-a-restful-webservice-using-c++

A continuación, necesitaría acceder a los datos alojados en su nuevo servidor RESTful de C ++: Mire esto: Rest clientes para Java?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top