我正在使用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 :(得分:0)
一方面注意,我认为您正在使用OAuth 2,但您正在构建类似于OAuth 1签名的签名类型。我相信你可以这样做:
utility::string_t sb = url.to_string();
sb += L"?access_token=" + accessToken;
虽然将访问令牌放在auth标头中稍微好一点:Authorization: Bearer <access token>
。
我不是百分百肯定,但我相信/files (POST)
需要一个多部分格式编码的主体(因此文件名来自正文中的附件)。我不确定如何用卡萨布兰卡来实现这一目标。但我真的坚持使用Dropbox的/files_put
并仅对需要它的平台使用POST
请求(并且可能它们具有更简单的接口用于该调用)。