使用 cpprest SDK 访问 Azure 存储服务

Access Azure storage service using cpprest SDK

我正在尝试使用 cpprest sdk 列出我的 Azure 存储帐户中的 blob,这是我的代码:

pplx::task<void> HTTPRequestCustomHeadersAsync()
{
    http_client client(L"https://<account-name>.blob.core.windows.net/?comp=list");

    // Manually build up an HTTP request with header and request URI.
    http_request request(methods::GET);
    request.headers().add(L"Authorization", L"Sharedkey <account-name>:<account-key>");
    request.headers().add(L"x-ms-date", L"Thu, 08 Feb 2018 20:31:55 GMT ");
    request.headers().add(L"x-ms-version", L"2017-07-29");

    return client.request(request).then([](http_response response)
    {
        // Print the status code.
        std::wostringstream ss;
        ss << L"Server returned returned status code " << response.status_code() << L"." << std::endl;
        std::wcout << ss.str();
    });

    /* Sample output:
    Server returned returned status code 200.
    */
}

我一直收到返回的状态代码 403。有人可以告诉我我做的是否正确吗?

请注意,您没有以正确的方式使用 cpprest-sdk,因为您在上面的代码中所做的是尝试直接(错误地)调用 Azure 存储 REST API完全经历 cpprest-sdk。

实际上,Azure 存储 REST API 合约的 HTTP header 中的帐户密钥不是纯文本。相反,出于一系列安全考虑,它是通过 Authentication for the Azure Storage Services 中提到的复杂步骤计算的。幸运的是,所有这些逻辑都被 cpprest-sdk 包裹起来了,你不需要了解它的内部工作原理:

// Define the connection-string with your values.
const utility::string_t storage_connection_string(U("DefaultEndpointsProtocol=https;AccountName=your_storage_account;AccountKey=your_storage_account_key"));

// Create the blob client.
azure::storage::cloud_blob_client blob_client = storage_account.create_cloud_blob_client();  

我建议您在使用 cpprest-sdk 之前先阅读 How to use Blob Storage from C++