全部产品
阿里云办公

调用说明

更新时间:2017-08-11 17:54:11

以DescribeDomainRecords接口为例(以下示例代码采用Java语言,关于更完整的示例程序及其他开发语言的示例代码,请参见阿里云开发者论坛http://bbs.aliyun.com/ ).

对应的Action是DescribeDomainRecords,需要一个必要的操作参数是DomainName。在添加了所有公共请求参数(除Signature)后,请求的URL是(为了便于阅读,这里是进行URL编码前的URL):

  1. http://alidns.aliyuncs.com/?Format=XML&AccessKeyId=testid&Action=DescribeDomainRecords&SignatureMethod=HMAC-SHA1&DomainName=example.com&SignatureNonce=f59ed6a9-83fc-473b-9cc6-99c95df3856e&SignatureVersion=1.0&Version=2015-01-09&Timestamp=2016-03-24T16:41:54Z

按照签名计算规则,先构造出规范化请求字符串(Canonicalized Query String),如下:

  1. AccessKeyId=testid&Action=DescribeDomainRecords&DomainName=example.com&Format=XML&SignatureMethod=HMAC-SHA1&SignatureNonce=f59ed6a9-83fc-473b-9cc6-99c95df3856e&SignatureVersion=1.0&Timestamp=2016-03-24T16%3A41%3A54Z&Version=2015-01-09

再构造出用于签名的字符串StringToSign值为:

  1. GET&%2F&AccessKeyId%3Dtestid&Action%3DDescribeDomainRecords&DomainName%3Dexample.com&Format%3DXML&SignatureMethod%3DHMAC-SHA1&SignatureNonce%3Df59ed6a9-83fc-473b-9cc6-99c95df3856e&SignatureVersion%3D1.0&Timestamp%3D2016-03-24T16%253A41%253A54Z&Version%3D2015-01-09

以下Java示例代码演示了如何添加公共请求参数、如何构造用请求参数构造规范化请求字符串,以及如何构造StringToSign字符串。示例假定所有请求参数放在一个Map<String, String>对象里,使用的Access Key ID是“testid”。

  1. final String HTTP_METHOD = "GET";
  2. Map<String, String> parameters = new HashMap<String, String>();
  3. // 加入请求参数
  4. parameters.put("Action", "DescribeDomainRecords");
  5. parameters.put("DomainName", "example.com");
  6. parameters.put("Version", "2015-01-09");
  7. parameters.put("AccessKeyId", "testid");
  8. parameters.put("Timestamp", formatIso8601Date(new Date()));
  9. parameters.put("SignatureMethod", "HMAC-SHA1");
  10. parameters.put("SignatureVersion", "1.0");
  11. parameters.put("SignatureNonce", UUID.randomUUID().toString());
  12. parameters.put("Format", "XML");
  13. // 对参数进行排序,注意严格区分大小写
  14. String[] sortedKeys = parameters.keySet().toArray(new String[]{});
  15. Arrays.sort(sortedKeys);
  16. final String SEPARATOR = "&";
  17. // 生成stringToSign字符串
  18. StringBuilder stringToSign = new StringBuilder();
  19. stringToSign.append(HTTP_METHOD).append(SEPARATOR);
  20. stringToSign.append(percentEncode("/")).append(SEPARATOR);
  21. StringBuilder canonicalizedQueryString = new StringBuilder();
  22. for(String key : sortedKeys) {
  23. // 这里注意对key和value进行编码
  24. canonicalizedQueryString.append("&")
  25. .append(percentEncode(key)).append("=")
  26. .append(percentEncode(parameters.get(key)));
  27. }
  28. // 这里注意对canonicalizedQueryString进行编码
  29. stringToSign.append(percentEncode(canonicalizedQueryString.toString().substring(1)));

其中需要注意的是,Timestamp参数要求符合ISO8601规范,并注意使用UTC时间,否则会遇到错误。下面的示例代码演示了如何生成符合规范的Timestamp字符串:

  1. private static final String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
  2. private static String formatIso8601Date(Date date) {
  3. SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT);
  4. df.setTimeZone(new SimpleTimeZone(0, "GMT"));
  5. return df.format(date);
  6. }

生成规范化请求字符串(示例中的canonicalizedQueryString变量),以及stringToSign时,都需要进行必要的编码。编码的规则在签名机制一节中有详细描述。下面的示例代码演示了如何用java.net.URLEncoder类完成编码:

  1. private static final String ENCODING = "UTF-8";
  2. private static String percentEncode(String value)
  3. throws UnsupportedEncodingException{
  4. return value != null ?
  5. URLEncoder.encode(value, ENCODING).replace("+", "%20")
  6. .replace("*", "%2A").replace("%7E", "~")
  7. : null;
  8. }

假定使用的Access Key Id是“testid”, Access Key Secret是“testsecret”,用于计算HMAC的Key就是“testsecret&”,最终计算得到的签名值为:

  1. uRpHwaSEt3J+6KQD//svCh/x+pI=

计算签名的示例代码(Java):

  1. // 以下是一段计算签名的示例代码
  2. final String ALGORITHM = "HmacSHA1";
  3. final String ENCODING = "UTF-8";
  4. key = "testsecret&";
  5. Mac mac = Mac.getInstance(ALGORITHM);
  6. mac.init(new SecretKeySpec(
  7. key.getBytes(ENCODING), ALGORITHM));
  8. byte[] signData = mac.doFinal(
  9. stringToSign.getBytes(ENCODING));
  10. String signature =
  11. new String(Base64.encodeBase64(signData));

增加签名参数后,请按照RFC3986规则进行URL编码后得到的:

  1. http://alidns.aliyuncs.com/?Format=XML&Action=DescribeDomainRecords&AccessKeyId=testid&SignatureMethod=HMAC-SHA1&DomainName=example.com&SignatureNonce=f59ed6a9-83fc-473b-9cc6-99c95df3856e&Version=2015-01-09&SignatureVersion=1.0&Signature=uRpHwaSEt3J%2B6KQD%2F%2FsvCh%2Fx%2BpI%3D&Timestamp=2016-03-24T16%3A41%3A54Z

接下来,通过HTTP请求的方式向上面的URL地址发送HTTP请求,并得到DNS服务端的响应结果(示例):

  1. <DescribeDomainRecordsResponse>
  2. <PageNumber>1</PageNumber>
  3. <DomainRecords>
  4. <Record>
  5. <DomainName>example.com</DomainName>
  6. <Line>default</Line>
  7. <Priority>1</Priority>
  8. <RR>2222</RR>
  9. <RecordId>51542601</RecordId>
  10. <TTL>600</TTL>
  11. <Type>MX</Type>
  12. <Value>hichina.com</Value>
  13. </Record>
  14. <Record>
  15. <DomainName>example.com</DomainName>
  16. <Line>default</Line>
  17. <RR>234234</RR>
  18. <RecordId>51542600</RecordId>
  19. <TTL>600</TTL>
  20. <Type>SRV</Type>
  21. <Value>3 0 2176 example-server.2.google.com</Value>
  22. </Record>
  23. <Record>
  24. <DomainName>example.com</DomainName>
  25. <Line>default</Line>
  26. <RR>2222</RR>
  27. <RecordId>51542068</RecordId>
  28. <TTL>600</TTL>
  29. <Type>A</Type>
  30. <Value>3.4.5.6</Value>
  31. </Record>
  32. </DomainRecords>
  33. <PageSize>3</PageSize>
  34. <TotalCount>3</TotalCount>
  35. <RequestId>F3440766-E1C5-4110-8285-5F53F6750560</RequestId>
  36. </DescribeDomainRecordsResponse>

通过解析这个XML结果即可以得到域名下所有解析记录的列表。如果在提交请求时,指定Format参数为JSON,那么返回结果的格式为JSON格式。