Спасибо, что сначала прочитали мой вопрос. Я сталкиваюсь с трудностями при подключении к Azure Blob из класса Salesforce APEX.
Я следую этому примеру и следую по ссылке для справки https://github.com/nagensahu/AzureBlobStorage-Salesforce/blob/master/Readme.md
public class AzureService {
public static AzureService.AzureWrapper signedsignature(AzureService.AzureWrapper wrapRec, Datetime timestamp, String fileName, String fileType, Integer fileLength){
wrapRec.timestamp = timestamp.formatGMT('EEE, dd MMM yyyy HH:mm:ss z');
wrapRec.fileName = EncodingUtil.urlEncode(fileName, 'UTF-8');
wrapRec.fileLength = String.valueof(fileLength);
wrapRec.fileType = fileType;
string canonHeaders = 'x-ms-blob-type:BlockBlob\nx-ms-date:'+wrapRec.timestamp+'\nx-ms-version:2015-12-11\n';
System.debug('canonHeaders-->'+canonHeaders);
string canonRes = '/'+wrapRec.storageName+'/'+wrapRec.container+'/'+wrapRec.fileName;
System.debug('canonRes-->'+canonRes);
string stringToSign = 'PUT';
stringToSign +='\n\n\n';
stringToSign+=wrapRec.fileLength;
stringToSign+='\n\n';
stringToSign+=wrapRec.fileType;
stringToSign+=';charset=UTF-8\n\n\n\n\n\n\n';
stringToSign+=+canonHeaders;
stringToSign+=canonRes;
System.debug('stringToSign-->'+stringToSign);
//System.debug('wrapRec.storageKey-->'+wrapRec.storageKey);
// Sign the request
Blob temp = EncodingUtil.base64Decode(wrapRec.storageKey);
Blob hmac = Crypto.generateMac('HMacSHA256', Blob.valueOf(stringToSign), temp);
wrapRec.signature = EncodingUtil.base64Encode(hmac);
System.debug('wrapRec.signature-->'+wrapRec.signature);
return wrapRec;
}
/*
public static void generateSharedKey(String strToSign, String key, String Account){
string canonHeaders = 'x-ms-blob-type:BlockBlob\nx-ms-date:'+wrapRec.timestamp+'\nx-ms-version:2015-12-11\n';
string canonRes = '/'+wrapRec.storageName+'/'+wrapRec.container+'/'+wrapRec.fileName;
string signature;
Blob unicodeKey = EncodingUtil.base64Decode(key);
Blob hmac = Crypto.generateMac('HMacSHA256', Blob.valueOf(signature), temp);
}
*/
public static boolean uploadToAzure(AzureService.AzureWrapper wrapRec, Blob fileBody){
boolean response = false;
HttpRequest req = new HttpRequest();
req.setTimeout(120000);
req.setMethod('PUT');
req.setHeader('x-ms-blob-type', 'BlockBlob');
req.setHeader('x-ms-date', wrapRec.timestamp);
System.debug('wrapRec.timestamp--->. '+wrapRec.timestamp);
string authHeader = 'SharedKey '+wrapRec.storageName+':'+ wrapRec.signature;
System.debug('AuthHeader--->. '+authHeader);
req.setHeader('x-ms-version', '2015-12-11');
req.setHeader('Content-Length', wrapRec.fileLength);
System.debug('wrapRec.fileLength--->. '+wrapRec.fileLength);
req.setHeader('Content-Type', wrapRec.fileType);
System.debug('wrapRec.fileType--->. '+wrapRec.fileType);
req.setHeader('Authorization', authHeader);
System.debug('https://'+wrapRec.storageName+'.blob.core.windows.net/'+wrapRec.container+'/'+wrapRec.fileName);
req.setEndpoint('https://'+wrapRec.storageName+'.blob.core.windows.net/'+wrapRec.container+'/'+wrapRec.fileName);
req.setBodyAsBlob(fileBody);
Http http = new Http();
try
{
HTTPResponse res = http.send(req);
system.debug(res.toString());
system.debug(res.getStatus());
system.debug(res.getStatusCode());
system.debug(res.getBody());
system.debug('getStatusCode ----.'+res.getStatusCode());
if(res.getStatusCode() == 201){
response = true;
}
}
catch (system.CalloutException ce)
{
system.debug('Error Occur----.'+ce);
}
return response;
}
//returns storage key, storage name and container
public static AzureService.AzureWrapper storageDetails(){
//Azure_Details__c detail = Azure_Details__c.getInstance();
String strStorageKey = 'OCiagdBEZw52wBfFbF9ndVdcdldyaXelnDqglhfAinngPC5+ydmSPlgEMyr6KcyoYhupJ0B0lJBGAI33k4VZFQ==';
String strStorageName = 'zaindevtesting';
String strContainer = 'zaindevblob';
return new AzureService.AzureWrapper(strStorageKey, strStorageName, strContainer);
//return new AzureService.azureWrapper(detail.StorageKey__c, detail.StorageName__c, detail.Container__c);
}
public class AzureWrapper{
String storageKey;
String storageName;
String container;
String timestamp;
String fileName;
String fileType;
String fileLength;
String signature;
public AzureWrapper(String sk, String sn, String cn){
this.storageKey = sk;
this.storageName = sn;
this.container = cn;
}
}
}
В конце концов мой заголовок выглядит так:
x-ms-date: ср, 11 марта 2020 г. 00:36:39 GMT x-ms-version: 2015-12-11 Content-Length: 213980 Авторизация : SharedKey zaindevtesting: 6SfwH21pfpr9NiiK8PXXL9IMOs9SWNEvl3Elj2Jfc3w% 3D-тип контента: application / pdf
Тип запроса PUT https://zaindevtesting.blob.core.windows.net/zaindevblob/Consent+form+%281%29.pdf
Я пытался использовать то же почтальон, но получаю Вы можете использовать эту же ссылку для доступа к моему тесту Azure от почтальона и сообщить мне, если требуется какая-то информация.
Я пытаюсь загрузить файл из отдела продаж, но получаю следующую ошибку.
<?xml version="1.0" encoding="utf-8"?>
<Error>
<Code>InvalidAuthenticationInfo</Code>
<Message>Authentication information is not given in the correct format. Check the value of Authorization header.
RequestId:6b4f54fd-501e-0013-5f9e-f6c88c000000
Time:2020-03-10T05:43:44.8911977Z</Message>
</Error>
Спасибо, Зейн