2016-02-17 2 views
0

Я пытаюсь отправить и получить объект protobuf с помощью Microsoft REST SDK. Если вы не знакомы с protobuf, представьте, что это могут быть любые другие необработанные данные. На стороне клиента вектор пуст. Я думаю, что я не правильно создаю потоки на стороне сервера.Как получить двоичные данные (protobuf) через REST SDK?

Метод прибудет сервер выглядит следующим образом:

void MyServer::handle_get(http_request message) 
{ 
// a class created with protobuf 
ns::user *user = new ns::user(); 
ns::user->set_id(-1); 
ns::user->set_name("Dark"); 
ns::user->set_email("[email protected]"); 

// this schould be fine 
int size = user->ByteSize(); 
void *buffer = malloc(size); 
user->SerializeToArray(buffer, size); 

// how to do? 
concurrency::streams::container_buffer<std::vector<char>> inBuffer; 
concurrency::streams::istream bodyStream = message.body(); 
inBuffer.putn((char*)buffer, size); 
Concurrency::task<size_t> read = bodyStream.read_to_end(inBuffer); 

message.reply(status_codes::OK, bodyStream, size, L"application/octet-stream"); 
delete user; 
}; 

Метод клиент, как это:

utility::ostringstream_t buf; 
    buf << "Dark" << "/" << "Foo" << "?" << "id=" << "1"; 
    http_response response = CheckResponse("server/user", server.request(methods::GET, buf.str()).get()); 
     if (response.status_code() == status_codes::OK) 
     { 
      cout << "STATUS OK" << endl; 

      Concurrency::streams::istream iStream = response.body(); 

      auto rslt0 = response.extract_vector(); 
      auto rslt = rslt0.get(); 
      cout << "Result has size: <" << rslt.size() << ">" << endl; 
      for (unsigned int i = 0; i < rslt.size(); i++) 
      { 
       cout << "Data" << i << ": <" << rslt.at(i) << ">" << endl; 
      } 

ответ

0

Я ответил на мой собственный вопрос. Нет необходимости в потоке; Я могу использовать двоичные данные, таким образом:

Сервер:

void MyServer::handle_get(http_request message) 
{ 
// a class created with protobuf 
ns::user *user = new ns::user(); 
ns::user->set_id(-1); 
ns::user->set_name("Dark"); 
ns::user->set_email("[email protected]"); 

int size = user->ByteSize(); 
unsigned char *buffer = new unsigned char(size); 

user->SerializeToArray(buffer, size); 
std::string out; 
user->SerializeToString(&out); 

std::vector<unsigned char> data(buffer, buffer + size); 
string_t outT = utility::conversions::to_base64(data); 
message.reply(status_codes::OK, outT); 
delete user; 
}; 

Клиент:

utility::ostringstream_t buf; 
buf << "Dark" << "/" << "Foo" << "?" << "id=" << "1"; 
http_response response = CheckResponse("server/user", server.request(methods::GET, buf.str()).get()); 
    if (response.status_code() == status_codes::OK) 
    { 
     cout << "STATUS OK" << endl; 
      geopp::gnUser *user = new geopp::gnUser(); 

      auto rslt = response.extract_string(); 
      auto rslt0 = utility::conversions::from_base64(rslt.get()); 
      user->ParseFromArray(rslt0.data(), rslt0.size()); 

      cout << "Result: name <" << user->name() << ">, id <" << user->id() << ">" << endl; 
}; 
0

стороне сервера:

std::vector<uint8_t> data; 
//TODO: fill data 
//convert the vector into a async istream 
auto instream = Concurrency::streams::bytestream::open_istream(data); 
message.reply(status_codes::OK, instream); 

стороне клиента:

wchar_t urlbuf[256]; 
//TODO: fill the url 
client->request(web::http::methods::GET,urlbuf).then([](web::http::http_response& resp){ 
    if(resp.status_code() != status_codes::OK){ 
     DLogError("error: status != ok");     
     return;     
    } 
    Concurrency::streams::container_buffer<std::vector<uint8_t> >inBuffer; 
    resp.body().read_to_end(inBuffer).then([](size_t bytesRead){ 
    //TODO: use it 
    } 
}