Pergunta

Estou refatoração legado C ++ sistema de SOA usando gSOAP. Temos alguns problemas de desempenho (muito grandes XMLs) para que minha liderança me pediu para dar uma olhada buffers de protocolo. Eu fiz, e ele parece muito legal (Precisamos C ++ e suporte Java). No entanto buffers de protocolo são solução justa para serialização e agora eu preciso para enviá-lo para front-end Java. O que devo usar a partir da perspectiva C ++ e Java para enviar essas coisas serializado sobre HTTP (rede apenas interna)?

PS. Outro cara tentativas de acelerar a nossa solução gSOAP, eu estou interessado em buffers de protocolo somente.

Foi útil?

Solução

Você certamente pode enviar mesmo uma carga binário com uma solicitação HTTP, ou em uma resposta HTTP. Basta escrever os bytes do protocolo tampão diretamente no pedido / resposta, e certifique-se de definir o tipo de conteúdo para "application / octet-stream". O cliente e servidor, deve ser capaz de cuidar do resto facilmente. Eu não acho que você precisa de nada mais especial do que em cada extremidade.

Outras dicas

Protobuf é um protocolo binário. Ele não se mistura bem com SOAP. Eu sugiro que você quer ficar com gSOAP ou converter para Protobuf inteiramente.

Com Protobuf, você define o seu protocolo em um formato especial como este,

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

A ferramenta protoc pode gerar código em C ++ / Java / Python para que possa serializar-lo em uma extremidade e deserialize em outro.

Como você pode ver, Protobuf é projetado para serializar objeto individual. Ele não fornece todas as facilidades oferecidas pelo SOAP, como cabeçalhos. Para contornar este problema, usamos Protobuf dentro Protobuf. Nós definimos um envelope 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;
}

O encodedMessage é outra mensagem Protobuf serializado. Todo o material no cabeçalho SOAP agora vai para headers.

Google frontends preferem application/protobuf.

O ProtocolBufferModel de o Google usos cliente API application/x-protobuf.

Você pode serializar / protobuf de-serialize dados codificados de / para strings. Enviar a string serializada como o corpo de um HTTP POST para Java e de serialize-la. Essa é uma abordagem. Outra maneira é fazer uso da interface de serviço protobuf. Protobuf permite definir uma interface de serviço em um arquivo .proto eo compilador buffer de protocolo irá gerar código de interface de serviço e topos no idioma escolhido. Você só precisa implementar o protobuf :: RpcChannel e aulas de protobuf :: RpcController para obter um quadro RPC completa. Provavelmente, você pode escrever um wrapper HTTP para essas classes. Veja os links a seguir para mais informações:

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

Para meu conhecimento apoio buffers de protocolo está disponível em C ++ e Java, você deve ser capaz de protocolo de troca de tampão de dados serializados entre os dois sistemas.

Dito isto, parece que sua verdadeira questão é "Como faço para enviar o material através de HTTP entre um backend C ++ e Java cliente"

É soar como você precisa aprender a usar gSOAP, leia a docs .

Como alternativa, você pode hospedar um servidor web RESTful de seu aplicativo C ++: Olhe para isso: https://stackoverflow.com/questions/298113/how-can-i-implement-a-restful-webservice-using-c++

Em seguida, você precisaria para acessar os dados hospedados em seu novo C ++ servidor RESTful: Olhe para isto: Resto clientes para Java?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top