プログラム例
この例ではDescribeDomainRecordsインターフェイスを使用しています(次のサンプルコードではJavaを使用していますが、他の開発言語でのサンプルプログラムや例については、Alibaba Cloud Developers Forumを参照してください)。
対応するアクションはDescribeDomainRecordsであり、必須パラメーターはDomainNameです。 すべての公開リクエストパラメータ(Signatureを除く)が追加された後、リクエストURLは次のようになります(読みやすくするため、URLエンコード前のURLです)。
http://dns.aliyuncs.com/?TimeStamp=2015-01-09T11:10:07Z&Format=xml&AccessKeyId=testid&Action=DescribeDomainRecords&SignatureMethod=HMAC-SHA1&DomainName=example.com&SignatureNonce=1324fd0e-e2bb-4bb1-917c-bd6e437f1710&SignatureVersion=1.0&Version=2015-01-09
署名の計算規則に従って、正規化されたクエリ文字列が最初に構築されます。
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が次の値を持つ署名文字列として作成されます。
GET&%2F&AccessKeyId%3Dtestid&Action%3DDescribeDomainRecords&Format%3Dxml&DomainName%3Dexample.com&SignatureMethod%3DHMAC-SHA1&SignatureNonce%3D1324fd0e-e2bb-4bb1-917c-bd6e437f1710&SignatureVersion%3D1.0&TimeStamp%3D2015-01-09T11%253A10%253A07Z&Version%3D2015-01-09
次のJavaサンプルコードは、公開リクエストパラメータの追加方法、リクエストパラメータからの正規化されたクエリ文字列の作成方法、およびStringToSignの構築方法を示しています。この例では、すべてのリクエストパラメータがMap<String、String>オブジェクトに格納され、アクセスキーIDが”testid”であることを前提としています。
final String HTTP_METHOD = "GET";
Map<String, String> parameters = new HashMap<String, String>();
// Add public request parameters
parameters.put("Action", "DescribeDomainRecords");
parameters.put("DomainName", "example.com");
parameters.put("Version", "2015-01-09");
parameters.put("AccessKeyId", "testid");
parameters.put("TimeStamp", formatIso8601Date(new Date()));
parameters.put("SignatureMethod", "HMAC-SHA1");
parameters.put("SignatureVersion", "1.0");
parameters.put("SignatureNonce", UUID.randomUUID().toString());
parameters.put("Format", "XML");
// Sort the parameters, and note they are strictly case-sensitive
String[] sortedKeys = parameters.keySet().toArray(new String[]{});
Arrays.sort(sortedKeys);
final String SEPARATOR = "&";
// Generate the stringToSign
StringBuilder stringToSign = new StringBuilder();
stringToSign.append(HTTP_METHOD).append(SEPARATOR);
stringToSign.append(percentEncode("/")).append(SEPARATOR);
StringBuilder canonicalizedQueryString = new StringBuilder();
for(String key : sortedKeys) {
// Be sure to encode the key and value
canonicalizedQueryString.append("&")
.append(percentEncode(key)).append("=")
.append(percentEncode(parameters.get(key)));
}
// Be sure to encode the canonicalizedQueryString
stringToSign.append(percentEncode(canonicalizedQueryString.toString().substring(1)));
この例では、TimeStampパラメータがISO8601規格に準拠している必要があることに注意してください。さらに、UTC時間が使用されていることに注意してください。そうしないと、リクエストにエラーが発生します。次のサンプルコードは、準拠した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, "GMT"));
return df.format(date);
}
正規化されたクエリ文字列(この例ではcanonicalizedQueryString変数)とStringToSignを生成するときは、両方をエンコードする必要があります。エンコーディングルールについては、署名メカニズムのセクションで詳しく説明しています。次のサンプルコードは、java.net.URLEncoderクラスを使用してエンコードする方法を示しています。
private static final String ENCODING = "UTF-8";
private static String percentEncode(String value)
throws UnsupportedEncodingException{
return value != null ?
URLEncoder.encode(value, ENCODING).replace("+", "%20")
.replace("*", "%2A").replace("%7E", "~")
: null;
}
“Access Key ID”が”testid”で、”Access Key Secret”が”testsecret”で、HMAC計算に使用されるKeyが”testsecret&”であると仮定すると、計算された署名値は次のようになります。
SmhZuLUnXmqxSEZ/GqyiwGqmf+M=
署名計算のサンプルコード(Java):
// The following is a sample code for signature calculation
final String ALGORITHM = "HmacSHA1";
final String ENCODING = "UTF-8";
key = "testsecret&";
Mac mac = Mac.getInstance(ALGORITHM);
mac.init(new SecretKeySpec(
key.getBytes(ENCODING), ALGORITHM));
byte[] signData = mac.doFinal(
stringToSign.getBytes(ENCODING));
String signature =
new String(Base64.encodeBase64(signData));
Signatureパラメータを追加した後、RFC3986の規則に従ってURLエンコーディングを実行すれば、最終的に次のURLが得られます。
http://dns.aliyuncs.com/?TimeStamp=2015-01-09T11%3A10%3A07Z&Format=xml&AccessKeyId=testid&Action=DescribeDomainRecords&SignatureMethod=HMAC-SHA1&DomainName=example.com&SignatureNonce=1324fd0e-e2bb-4bb1-917c-bd6e437f1710&SignatureVersion=1.0&Version=2015-01-09&Signature=SmhZuLUnXmqxSEZ%2FGqyiwGqmf%2BM%3D
次に、上記のURLでHTTPリクエストを送信すると、次のように、DNSサーバーからリクエストに対するレスポンスが受信されます。
<DescribeDomainRecordsResponse>
<PageNumber>1</PageNumber>
<DomainRecords>
<Record>
<DomainName>example.com</DomainName>
<Line>default</Line>
<Priority>1</Priority>
<RR>2222</RR>
<RecordId>51542601</RecordId>
<TTL>600</TTL>
<Type>MX</Type>
<Value>hichina.com</Value>
</Record>
<Record>
<DomainName>example.com</DomainName>
<Line>default</Line>
<RR>234234</RR>
<RecordId>51542600</RecordId>
<TTL>600</TTL>
<Type>SRV</Type>
<Value>3 0 2176 example-server.2.google.com</Value>
</Record>
<Record>
<DomainName>example.com</DomainName>
<Line>default</Line>
<RR>2222</RR>
<RecordId>51542068</RecordId>
<TTL>600</TTL>
<Type>A</Type>
<Value>3.4.5.6</Value>
</Record>
</DomainRecords>
<PageSize>3</PageSize>
<TotalCount>3</TotalCount>
<RequestId>F3440766-E1C5-4110-8285-5F53F6750560</RequestId>
</DescribeDomainRecordsResponse>
このXML形式の結果を解析することにより、ユーザーはドメイン名配下のすべてのDNSレコードのリストを取得します。リクエスト送信時にFormatパラメータがJSONとして指定されている場合、結果もJSON形式で返されます。