2012-02-08 652 views
0

环顾四周,发现一些答案,表明我应该使用REST。但是,我如何将它整合到Qt/C++中?任何人都可以链接一些例子或者几行代码?会真的很感激它!访问Azure blob存储使用C++

+0

http://stackoverflow.com/questions/8471810/accessing-azure-storage-tables-from-c-code/9476451#9476451 – chikuba 2012-02-28 21:50:03

回答

1

请检查出this question。它涵盖了您所要求的内容,并概述了几个免费提供的C++库,您可以使用它们来访问Azure服务。

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())); 

我希望它能帮助别人。