API-интерфейс REST Azure для получения сведений о размере хранилища с использованием Java - PullRequest
0 голосов
/ 19 июня 2019

Я использую API-интерфейс REST Azure для получения сведений о размере BLOB-объектов хранилища с помощью java. Я получил ответ «Серверу не удалось аутентифицировать запрос. Убедитесь, что значение заголовка авторизации сформировано правильно, включая подпись»

    public static void getContainer() throws Exception {
            // Account info
            String accountName = "StorageName";
            String accountKey = "StorageKey";

            // Request Uri and Method
            String containerName = "ContainerName";
            String requestUri = "https://" + accountName + ".blob.core.windows.net/" + containerName + "?restype=container&comp=metadata";
            System.out.println("requestUri = " + requestUri);
            HttpURLConnection connection = (HttpURLConnection) (new URL(requestUri)).openConnection();
            connection.setRequestMethod("GET");

            // Request Headers
            // 1. x-ms-version, recommend to use the latest version if possible
            String serviceVersion = "2018-03-28";
            // 2. x-ms-date
            SimpleDateFormat fmt = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss");
            fmt.setTimeZone(TimeZone.getTimeZone("GMT"));
            String date = fmt.format(Calendar.getInstance().getTime()) + " GMT";

            String authKeyFormat = "SharedKey";
            String caHeader = "x-ms-date:" + date + "\nx-ms-version:" + serviceVersion + "\n";
            String caResource = "/" + accountName + "/" + containerName + "ncomp:metadata\\nrestype:container";
            String signStr = "GET\n\n\n\n\n\n\n\n\n\n\n" + caHeader + caResource;
            System.out.println("signStr = " + signStr);
            String authorization = getAuthorization(accountName, authKeyFormat, signStr, accountKey);
            System.out.println("x-ms-version = " + serviceVersion);
            System.out.println("x-ms-date = " + date);
            System.out.println("Authorization = " + authorization);
            connection.setRequestProperty("x-ms-version", serviceVersion);
            connection.setRequestProperty("x-ms-date", date);
            connection.setRequestProperty("Authorization", authorization);
            connection.setDoOutput(true);
            connection.setFixedLengthStreamingMode(0);

            System.out.println("Response message : " + connection.getResponseMessage());
            System.out.println("Response code : " + connection.getResponseCode());
        }

        private static String getAuthorization(String accountName, String authKeyFormat, String signStr, String accountKey) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException, java.security.InvalidKeyException, Base64DecodingException {
            SecretKeySpec secretKey = new SecretKeySpec(Base64.decode(accountKey), "HmacSHA256");
            Mac sha256HMAC = Mac.getInstance("HmacSHA256");
            sha256HMAC.init(secretKey);
            String signature = Base64.encode(sha256HMAC.doFinal(signStr.getBytes("UTF8")));
            return authKeyFormat + " " + accountName + ":" + signature;
        }

Запрос хранилища и подробности ответа

  GET -  https://StorageName.blob.core.windows.net/ContainerName?restype=container&comp=metadata   
    x-ms-version = 2018-03-28
    x-ms-date = Tue, 18 Jun 2019 13:46:41 GMT
    Authorization = SharedKey StorageName:Pp8E/FAxeIHDYs17r2GRYvL8xAgJ/D5eJuqlVW3+aiU=

Ответное сообщение: серверу не удалось аутентифицировать запрос.Убедитесь, что значение заголовка авторизации сформировано правильно, включая подпись.Код ответа: 403

мы не можем аутентифицировать Учетную запись хранения, поэтому мы не можем получить размер содержимого BLOB-объекта

1 Ответ

0 голосов
/ 26 июня 2019

Я бы предложил вам использовать Java SDK для хранилища Azure, поскольку это дает гибкость и больше возможностей. Используя SDK, вы можете просто использовать BlobProperties для получения размера.

Вы можете обратиться ниже документ:

https://azure.github.io/azure-sdk-for-java/com/microsoft/azure/storage/blob/BlobProperties.html#getLength--

Если вы все еще планируете использовать остальные API, я бы посоветовал вам взглянуть на API ниже:

https://myaccount.blob.core.windows.net/mycontainer/myblob

Операция **Get Blob** Properties возвращает все пользовательские метаданные, стандартные свойства HTTP и системные свойства для большого двоичного объекта. Не возвращает содержимое BLOB-объекта

Вот пример ответа Content-Length: тег, который может вас заинтересовать, так как он дает общий размер в байтах.

Response Status:  
HTTP/1.1 200 OK  

Response Headers:  
x-ms-meta-Name: myblob.txt  
x-ms-meta-DateUploaded: <date>  
x-ms-blob-type: AppendBlob  
x-ms-lease-status: unlocked  
x-ms-lease-state: available  
Content-Length: 11  
Content-Type: text/plain; charset=UTF-8  
Date: <date>  
ETag: "0x8CAE97120C1FF22"  
Accept-Ranges: bytes  
x-ms-blob-committed–block-count: 1  
x-ms-version: 2015-02-21  
Last-Modified: <date>  
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0  
x-ms-copy-id: 36650d67-05c9-4a24-9a7d-a2213e53caf6  
x-ms-copy-source: <url>  
x-ms-copy-status: success  
x-ms-copy-progress: 11/11  
x-ms-copy-completion-time: <date>  

Надеюсь, это поможет.

https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-properties

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...