Подтвердить что ты не робот

Буферы протокола Google и HTTP

Я рефакторинг устаревшей системы С++ для SOA с помощью gSoap. У нас есть некоторые проблемы с производительностью (очень большие XML файлы), поэтому мое руководство попросило меня взглянуть на буферы протокола. Я сделал, и это выглядит очень круто (нам нужны поддержка на С++ и Java). Однако буферы протокола - это решение только для сериализации, и теперь мне нужно отправить его в интерфейс Java. Что я должен использовать с точки зрения С++ и Java для отправки этих сериализованных данных через HTTP (только внутренняя сеть)?

PS. Другой парень пытается ускорить решение gSoap, меня интересуют только протокольные буферы.

4b9b3361

Ответ 1

Вы можете отправить даже двоичную полезную нагрузку с помощью HTTP-запроса или в ответ HTTP. Просто напишите байты буфера протокола непосредственно в запросе/ответе и не забудьте установить тип содержимого "application/octet-stream". Клиент и сервер должны иметь возможность позаботиться об остальном легко. Я не думаю, что вам нужно что-то более особенное, чем с обеих сторон.

Ответ 2

ProtoBuf - это двоичный протокол. Он не очень хорошо сочетается с SOAP. Я предлагаю вам либо использовать gSOAP, либо полностью конвертировать в ProtoBuf.

С protoBuf вы определяете свой протокол в специальном формате, например,

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

Инструмент protoc может генерировать код в С++/Java/Python, чтобы вы могли сериализовать его на одном конце и десериализовать на другом.

Как вы можете видеть, ProtoBuf предназначен для сериализации отдельного объекта. Он не предоставляет все средства, предоставляемые SOAP, например, заголовки. Чтобы обойти эту проблему, мы используем ProtoBuf внутри ProtoBuf. Мы определяем такой конверт,

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 - это еще одно сериализованное сообщение ProtoBuf. Все содержимое в заголовке SOAP теперь идет на headers.

Ответ 3

Вы можете сериализовать/дезацинировать закодированные данные protobuf в/из строк. Отправьте сериализованную строку как тело HTTP POST на Java и де-сериализуйте его. Это один из подходов. Другой способ - использовать интерфейс службы protobuf. Protobuf позволяет вам определить интерфейс службы в файле .proto, а компилятор буфера протокола будет генерировать код интерфейса и заглушки на выбранном вами языке. Вам нужно всего лишь реализовать классы protobuf:: RpcChannel и protobuf:: RpcController, чтобы получить полную инфраструктуру RPC. Вероятно, вы можете написать HTTP-обертку для этих классов. Для получения дополнительной информации см. Следующие ссылки:

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

Ответ 4

Предпочтения Google предпочитают application/protobuf.

ProtocolBufferModel клиента API Google использует application/x-protobuf.

Ответ 5

Насколько я знаю, поддержка буферов протоколов доступна как на С++, так и на Java, вы должны иметь возможность обмениваться последовательными данными буфера протокола между обеими системами.

Тем не менее, кажется, что ваш реальный вопрос: "Как отправить материал через HTTP между бэкэндом С++ и клиентом Java"

Похоже, вам нужно научиться пользоваться gSOAP, читать docs.

В качестве альтернативы вы можете разместить веб-сервер RESTful из своего приложения на С++. Посмотрите на это: https://stackoverflow.com/info/298113/how-can-i-implement-a-restful-webservice-using-c ++

Далее вам нужно будет получить доступ к данным, размещенным на вашем новом сервере С++ RESTful: Посмотрите на это: Отложить клиентов на Java?