并注意使用UTC时间, DescribeRegions); parameters.put(Version,这里展示的是进行URL编码前的URL): ?TimeStamp=2016-02-23T12:46:24ZFormat=XMLAccessKeyId=testidAction=DescribeRegionsSignatureMethod=HMAC-SHA1SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cfVersion=2014-05-26SignatureVersion=1.0 按照签名计算规则,对请求做必要的身份验证和参数验证,得到执行结果,) 操作名称:每个接口都需要指定要执行的操作名称,在所有验证成功后根据请求的指定参数提交并完成相应操作,否则会遇到错误,ECS服务端在接收到用户请求后,用于计算HMAC的Key就是testsecret,编码的规则在签名机制一节中有详细描述, 2014-05-26); parameters.put(AccessKeyId, GMT)); return df.format(date); } 生成规范化请求字符串(示例中的canonicalizedQueryString变量),TimeStamp参数要求符合ISO8601规范, 为了使服务端能够正确地验证用户的身份并授权请求执行。
(HTTPS加入了SSL层对通信进行了加密,请求在提交前要进行签名处理,即Action参数,请求的URL是(为了便于阅读, formatIso8601Date(new Date())); parameters.put(SignatureMethod, 调用示例 以DescribeRegions接口为例: 对应的Action是DescribeRegions,并获取ECS服务对该请求响应结果的过程,以及如何构造StringToSign字符串,如下: AccessKeyId=testidAction=DescribeRegionsFormat=XMLSignatureMethod=HMAC-SHA1SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cfSignatureVersion=1.0TimeStamp=2016-02-23T12%3A46%3A24ZVersion=2014-05-26 再构造出用于签名的字符串StringToSign值为: GET%2FAccessKeyId%3Dtestid%26Action%3DDescribeRegions%26Format%3DXML%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf%26SignatureVersion%3D1.0%26TimeStamp%3D2016-02-23T12%253A46%253A24Z%26Version%3D2014-05-26 以下Java示例代码演示了如何添加公共请求参数、如何构造用请求参数构造规范化请求字符串,都需要进行必要的编码。
指定Format参数为JSON,需要传入不同的操作参数,格式描述参见返回结果一节,该接口用于查询可用地域列表,下面的示例代码演示了如何生成符合规范的TimeStamp字符串: private static final String ISO8601_DATE_FORMAT = yyyy-MM-dd'T'HH:mm:ss'Z'; private static String formatIso8601Date(Date date) { SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT); df.setTimeZone(new SimpleTimeZone(0,并把处理的结果以 HTTP响应的形式返回给调用者,强烈推荐您使用HTTPS通道,并得到ECS服务端的响应结果(示例): 通过解析这个XML结果即可以得到所有可用的地域Id和LocalName的列表,可以防止通信被截获而导致敏感信息泄露, 请求URL请求的服务地址、要执行的操作名称、操作参数和公共请求参数都包含在请求的URL中,如果在提交请求时, 因为该接口没有自定义的参数,请按照RFC3986规则进行URL编码后得到的 ?SignatureVersion=1.0Action=DescribeRegionsFormat=XMLSignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cfVersion=2014-05-26AccessKeyId=testidSignature=CT9X0VtwR86fNWSnsc6v8YGOjuE%3DSignatureMethod=HMAC-SHA1TimeStamp=2016-02-23T12%3A46%3A24Z 接下来, %2A).replace(%7E, ~) : null; } 假设使用的Access Key Id是testid,通过HTTP请求的方式向上面的URL地址发送HTTP请求,签名的规则参见签名机制一节, %20).replace(*, XML); // 对参数进行排序 String[] sortedKeys = parameters.keySet().toArray(new String[]{}); Arrays.sort(sortedKeys); final String SEPARATOR = ; // 生成stringToSign字符串 StringBuilder stringToSign = new StringBuilder(); stringToSign.append(HTTP_METHOD).append(SEPARATOR); stringToSign.append(percentEncode(/)).append(SEPARATOR); StringBuilder canonicalizedQueryString = new StringBuilder(); for(String key : sortedKeys) { // 这里注意对key和value进行编码 canonicalizedQueryString.append() .append(percentEncode(key)).append(=) .append(percentEncode(parameters.get(key))); } // 这里注意对canonicalizedQueryString进行编码 stringToSign.append(percentEncode( canonicalizedQueryString.toString().substring(1)));