Как использовать Касабланку для вызова / файлов (POST) в Dropbox API

Я использую c ++ и Casablanca, чтобы добавить функциональность Dropbox в наше программное обеспечение.

Я могу войти в систему с помощью OAuth 2, получить метаданные, открыть файлы и сохранить файлы с помощью files_put успешно.
Однако я не могу понять, как сохранить файл, используя / files (POST).

Я использую код, похожий на этот: (то есть я удалил некоторые функции, чтобы просто показать жестко закодированные строки, с которыми я в конечном итоге)

{
using concurrency::streams::file_stream;
using concurrency::streams::basic_istream;

utility::string_t strURI = L"https://api-content.dropbox.com/1/files/dropbox/";
uri url(uri::encode_uri(strURI));

utility::string_t sb = url.to_string();
sb += L"?oauth_consumer_key=" + consumerKey + L"&";
sb += L"oauth_nonce=" + nonce + L"&";
sb += L"oauth_timestamp=" + timestamp + L"&";
sb += L"oauth_version=2.0";
sb += L"&access_token=" + accessToken;
sb += L"&file=" + strFilename; // I've tried with and without this line

return file_stream<unsigned char>::open_istream(strPath)
.then([sb, url, &bRet](task<basic_istream<unsigned char>> previousTask)
{
try
{
auto fileStream = previousTask.get();
//get the content length, used to set the Content-Length property
fileStream.seek(0, std::ios::end);
auto length = static_cast<size_t>(fileStream.tell());
fileStream.seek(0, 0);

// Make HTTP request with the file stream as the body.
http_request req;
http_client client(sb);
req.set_body(fileStream);
req.set_method(methods::POST);
return client.request(req)
.then([fileStream, &bRet](task<http_response> previousTask)
{
// Process response
}
}
};
}

Я получил неправильный ответ на запрос.
Я предполагаю, что проблема в том, что я неправильно указываю параметр имени файла, но я не знаю, куда он должен идти. Или, может быть, я что-то упускаю полностью.

Может кто-нибудь, пожалуйста, помогите уточнить это для меня?

0

Решение

С одной стороны, я думаю, что вы используете OAuth 2, но вы создаете подпись вроде подписи OAuth 1. Я считаю, что вы можете просто сделать это:

utility::string_t sb = url.to_string();
sb += L"?access_token=" + accessToken;

Хотя немного предпочтительнее поместить токен доступа в заголовок auth: Authorization: Bearer <access token>,

Я не уверен на 100%, но я верю /files (POST) требуется тело, закодированное в форме, состоящей из нескольких частей (поэтому имя файла происходит из вложения в теле). Я не уверен, как это сделать с Касабланкой. Но я бы действительно придерживался /files_put для Dropbox и использования POST Запросы только для платформ, которые требуют этого (и, возможно, они имеют более простые интерфейсы для этого вызова).

0

Другие решения

Других решений пока нет …