更新时间:2024-06-19 GMT+08:00
分享

获取文件系统列表

操作场景

如果用户想要查看自己创建的所有文件系统信息,可以使用获取文件系统列表接口查看。

下面介绍如何调用获取文件系统列表API,API的调用方法请参见通用文件系统快速入门

前提条件

获取cn-north-4区域的文件系统列表

示例中使用通用的Apache Http Client。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package com.sfsclient;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;

public class TestMain {
    // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。
    // 您可以登录访问管理控制台获取访问密钥AK/SK
    public static String accessKey = "ACCESS_KEY_ID"; 
    public static String securityKey = "SECRET_ACCESS_KEY_ID"; 
    public static String endpoint = "sfs3.cn-east-3.myhuaweicloud.com"; // 通用文件系统服务地址

    public static void main(String[] str) {
        createFileSystem();

    }
    private static void listFileSystem() {
        String httpMethod = "GET";
        String date = DateUtils.formatDate(System.currentTimeMillis());

        /** 根据请求计算签名**/
        String contentMD5 = "";
        String contentType = "";
        String canonicalizedHeaders = "x-obs-bucket-type:SFS";
        String canonicalizedResource = "/" ;

        // Content-MD5 、Content-Type 没有直接换行, data格式为RFC 1123,和请求中的时间一致
        String stringToSign = httpMethod + "\n" +
                contentMD5 + "\n" +
                contentType + "\n" +
                date + "\n" +
                canonicalizedHeaders  + "\n" + canonicalizedResource;

        System.out.printf("StringToSign:\n[%s]\n\n", stringToSign);

        HttpURLConnection conn = null;

        try {
            String signature = Signature.signWithHmacSha1(securityKey, stringToSign);
            String authorization= "OBS " + accessKey + ":" + signature;
            System.out.printf("authorization:%s\n\n", authorization);

            // 创建http请求
            URL url = new URL("http://" + endpoint);
            conn = (HttpURLConnection) url.openConnection();

            // 增加签名头域
            conn.setRequestMethod(httpMethod);
            conn.setRequestProperty("Date", date);
            conn.setRequestProperty("Content-Type", contentType);
            conn.setRequestProperty("x-obs-bucket-type", "SFS");
            conn.setRequestProperty("Authorization", authorization);
            conn.setDoOutput(true);

            String status = conn.getHeaderField(null);
            System.out.println(status);

            // 输出收到的响应消息
            Map<String, List<String>> headers = conn.getHeaderFields();
            for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
                String key = entry.getKey();
                List<String> values = entry.getValue();
                if (key != null) {
                    for (String value : values) {
                        System.out.println(key + ": " + value);
                    }
                }
            }
            // 请求返回内容处理
            int statusCode = conn.getResponseCode();
            if (statusCode == HttpURLConnection.HTTP_OK) {
                InputStream responseStream = conn.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(responseStream));

                StringBuilder responseBody = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    responseBody.append(line);
                }
                reader.close();

                System.out.println("responseBody: " + responseBody);
            } else {
                System.out.println("Error: " + statusCode);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (conn != null){
                conn.disconnect();
            }
        }
    }
}

其中Date头域DateUtils的格式为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package com.sfsclient;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.TimeZone;

public class DateUtils {

    public static String formatDate(long time)
    {
        DateFormat serverDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH);
        serverDateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
        return serverDateFormat.format(time);
    }
}

签名字符串Signature的计算方法为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.sfsclient;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
import java.util.Base64;

public class Signature {
    public static String signWithHmacSha1(String sk, String canonicalString) throws UnsupportedEncodingException {

        try {
            SecretKeySpec signingKey = new SecretKeySpec(sk.getBytes("UTF-8"), "HmacSHA1");
            Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(signingKey);
            return Base64.getEncoder().encodeToString(mac.doFinal(canonicalString.getBytes("UTF-8")));
        } catch (NoSuchAlgorithmException | InvalidKeyException | UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }
}

相关文档