2012-02-08 265 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())); 

我希望它能幫助別人。