Azure存储服务Rest API:获取容器元数据

时间:2018-08-28 10:57:47

标签: java rest azure azure-storage azure-storage-blobs

拨打Get Container Metadata时遇到以下错误。

  

响应码:403

     

响应消息:服务器无法验证请求。确保Authorization标头的值格式正确,包括   签名。

StringToSign = "GET\n\n\n\n\n\n\n\n\n\n\n\nx-ms-date:" + date + "\nx-ms-version:" + "2014-02-14\n" + "/" + storageAccount + "/"+ "container-test"+"\nrestype:container\ncomp:metadata";

https://docs.microsoft.com/en-us/rest/api/storageservices/get-container-metadata

1 个答案:

答案 0 :(得分:0)

尝试以下代码。

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

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

    // Request Headers
    // 1. x-ms-version
    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";
    // 3. Authorization
    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\n"+caHeader+caResource;
    String authorization = getAuthorization(accountName, authKeyFormat, signStr, accountKey);

    // Send request
    connection.setRequestProperty("x-ms-version", serviceVersion);
    connection.setRequestProperty("x-ms-date",date);
    connection.setRequestProperty("Authorization", authorization);
    connection.connect();

    // OutPut response status
    System.out.println("Response message : " + connection.getResponseMessage());
    System.out.println("Response code : " + connection.getResponseCode());

    // OutPut Metadata
    connection.getHeaderFields().forEach(new BiConsumer<String, List<String>>() {
        @Override
        public void accept(String s, List<String> strings) {
            if(s!=null && s.startsWith("x-ms-meta")){
                System.out.println(s+":"+strings.get(0));
            }
        }
    });
}

private static String getAuthorization(String accountName, String authKeyFormat, String signStr, String accountKey) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException {

    SecretKeySpec secretKey = new SecretKeySpec(Base64.getDecoder().decode(accountKey), "HmacSHA256");
    Mac sha256HMAC = Mac.getInstance("HmacSHA256");
    sha256HMAC.init(secretKey);
    String signature = Base64.getEncoder().encodeToString(sha256HMAC.doFinal(signStr.getBytes("UTF-8")));

    return authKeyFormat+" "+accountName+":"+signature;
}