Google Protocol Buffers и HTTP - PullRequest
       72

Google Protocol Buffers и HTTP

37 голосов
/ 15 сентября 2009

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

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

Ответы [ 5 ]

58 голосов
/ 15 сентября 2009

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

24 голосов
/ 15 сентября 2009

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

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

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

Инструмент protoc может генерировать код на C ++ / 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.

6 голосов
/ 05 июня 2015

Google предпочитают внешние интерфейсы application/protobuf.

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

5 голосов
/ 15 сентября 2009

Вы можете сериализовать / десериализовать закодированные данные 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

2 голосов
/ 15 сентября 2009

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

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

Похоже, вам нужно научиться пользоваться gSOAP, прочитайте документы .

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

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

...