使用C ++访问Azure blob存储

时间:2012-02-08 21:54:00

标签: c++ qt rest azure azure-storage

环顾四周,发现一些答案表明我应该使用REST。但是我如何在Qt / c ++中集成它?任何人都可以链接这个或几行代码的一些例子吗?非常感谢!

2 个答案:

答案 0 :(得分:2)

我花了很多时间来实现它。最棘手的是你必须解码你的主键。在this question的帮助下,我决定使用OpenSSL并且我已经制作了以下代码。

QString datastring = "GET\n\n\n\n\n\n\n\n\n\n\n\nx-ms-date:" + date + "\nx-ms-version:2009-09-19\n/myStorage/\ncomp:list";
QByteArray ba = datastring.toUtf8();

unsigned char* signature = reinterpret_cast<unsigned char*>(ba.data());
QByteArray kba = QByteArray::fromBase64("theStorageAccountKey");
unsigned char* key = (unsigned char*) kba.data();
unsigned char result[EVP_MAX_MD_SIZE];
unsigned int result_len;
ENGINE_load_builtin_engines();
ENGINE_register_all_complete();

HMAC_CTX ctx;
HMAC_CTX_init(&ctx);
HMAC_Init_ex(&ctx, key, strlen((const char*)key), EVP_sha256(), NULL);
HMAC_Update(&ctx, signature, strlen((const char*)signature));
HMAC_Final(&ctx, result, &result_len);
HMAC_CTX_cleanup(&ctx);

QByteArray array = QByteArray::fromRawData((char*)result, result_len);
array = array.toBase64();
qDebug() << "signature hash" << array;

QString version = "2009-09-19";

//requesting the list of container to Windows Azure
QNetworkAccessManager* manager = new QNetworkAccessManager();
QNetworkRequest request;
request.setUrl(QUrl("http://myStorage.blob.core.windows.net/?comp=list"));
request.setRawHeader("Authorization","SharedKey myStorage:" + array);
request.setRawHeader("x-ms-date", date.toStdString().c_str());
request.setRawHeader("x-ms-version", version.toStdString().c_str());
QNetworkReply *reply = manager->get(request);
connect(reply, SIGNAL(readyRead()), this, SLOT(manageCloudReply()));

我希望它能帮到某个人。

答案 1 :(得分:1)

请查看this question。它涵盖了您的要求,并概述了几个免费提供的C ++库,您可以将这些库用于访问Azure服务。