当前主流的公有云,如亚马逊、阿里云、腾讯云,
其API的访问都支持使用签名信息,以验证请求者的身份。
而生成签名信息的第一步,
就是对请求参数进行排序,按照ASCII码升序排列。
下面示例将展示,Java 环境下,如何对请求参数进行ASCII码的升序排序。

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Test3 {
	public static void main(String[] args) {

		// 方式一:TreeMap可以自动排序
		TreeMap<String, Object> params = new TreeMap<String, Object>();
		setData(params);
		
		StringBuilder s1 = new StringBuilder();
        for (String key : params.keySet()) {
            s1.append(key).append("=").append(params.get(key)).append("&");
        }
        s1.deleteCharAt(s1.length() - 1);
		System.out.println(s1);
		
		//方式二:使用HashMap,并使用Arrays.sort排序
		HashMap<String, Object> params2 = new HashMap<String, Object>();
		setData(params2);
		String[] sortedKeys = params2.keySet().toArray(new String[]{});
		Arrays.sort(sortedKeys);// 排序请求参数
		StringBuilder s2 = new StringBuilder();
        for (String key : sortedKeys) {
        	s2.append(key).append("=").append(params2.get(key)).append("&");
        }
        s2.deleteCharAt(s2.length() - 1);
		System.out.println(s2);
		
		System.out.println(s1.toString().equals(s2.toString()));
		

	}
	
	private  static void setData(Map<String,Object> params){
		params.put("Nonce", 11886); 
		params.put("Timestamp", 1465185768); 
		params.put("SecretId", "AKIDz8krbsJ5yKBZQpn74WFkmLPx3EXAMPLE");
		params.put("Action", "DescribeInstances"); 
		params.put("Version", "2017-03-12"); 
		params.put("Region", "ap-guangzhou"); 
		params.put("Limit", 20); 
		params.put("Offset", 0); 
		params.put("测试", "测试"); 
	}
}

输出结果:
Action=DescribeInstances&Limit=20&Nonce=11886&Offset=0&Region=ap-guangzhou&SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3EXAMPLE&Timestamp=1465185768&Version=2017-03-12&测试=测试

Action=DescribeInstances&Limit=20&Nonce=11886&Offset=0&Region=ap-guangzhou&SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3EXAMPLE&Timestamp=1465185768&Version=2017-03-12&测试=测试

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐