0

我正在使用 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
            }
        }
    };
}

我收到了错误的请求响应。我认为问题是我没有正确地给它文件名参数,但我不知道它应该去哪里。或者,也许我完全错过了其他东西。

谁能帮我澄清一下?

4

1 回答 1

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只对需要它的平台使用请求(也许他们对该调用有更简单的接口)。

于 2014-04-07T16:46:45.587 回答