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

'Выразительный' означает, что легко написать код, который это легко понять, и для компилятора и для читателя.

Два фактора, которые делают для выразительности:

  • интуитивно читаемые конструкции
  • отсутствие шаблонного кода

Сравнивают этот выразительный Groovy, с менее выразительным Java eqivalent:

3.times {
   println 'Hip hip hooray'
}

по сравнению с

for(int i=0; i<3; i++) {
    System.out.println("Hip hip hooray");
}

Иногда Вы обмениваете точность на выразительность - работы Groovy в качестве примера, потому что она принимает материал, который Java делает Вас для определения явно.

39
задан Nazgob 6 March 2016 в 15:20
поделиться

4 ответа

You can certainly send even a binary payload with an HTTP request, or in an HTTP response. Just write the bytes of the protocol buffer directly into the request/response, and make sure to set the content type to "application/octet-stream". The client, and server, should be able to take care of the rest easily. I don't think you need anything more special than that on either end.

59
ответ дан 27 November 2019 в 02:18
поделиться

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

С помощью 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. Мы определяем Envelope следующим образом:

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 теперь переходит в заголовки .

24
ответ дан 27 November 2019 в 02:18
поделиться

You can serialize/de-serialize protobuf encoded data to/from strings. Send the serialized string as the body of an HTTP POST to Java and de-serialize it. That is one approach. Another way is to make use of the protobuf Service interface. Protobuf allows you to define a service interface in a .proto file and the protocol buffer compiler will generate service interface code and stubs in your chosen language. You only need to implement the protobuf::RpcChannel and protobuf::RpcController classes to get a complete RPC framework. Probably you can write an HTTP wrapper for these classes. See the following links for more information:

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

5
ответ дан 27 November 2019 в 02:18
поделиться

To my knowledge protocol buffers support is available in both C++ and Java, you should be able to exchange protocol buffer serialized data between both systems.

That said, it seems your real question is "How do I send stuff over HTTP between a C++ backend and Java client"

It sound like you need to learn how to use gSOAP, read the docs.

Alternatively you could host a RESTful web server from your C++ app: Look at this: https://stackoverflow.com/questions/298113/how-can-i-implement-a-restful-webservice-using-c++

Next you would need to access the data hosted on your new C++ RESTful server: Look at this: Rest clients for Java?

2
ответ дан 27 November 2019 в 02:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: