1、阿里云DNS的SDK依赖

<dependency>
	<groupId>com.aliyun</groupId>
	<artifactId>tea-openapi</artifactId>
	<version>0.0.19</version>
</dependency>
<dependency>
	<groupId>com.aliyun</groupId>
	<artifactId>alidns20150109</artifactId>
	<version>2.0.1</version>
</dependency>

2、第一个方法:创建SDK客户端实例

所有解析记录的操作都要通过这个客户端实例来进行,所以要首先创建这个实例,需要阿里云的AccessKey(AppId和AppSecret)

/**
 * <p>
 * 创建客户端实例
 * </p>
 *
 * @return
 * @throws Exception
 */
private Client createClient() throws Exception{
	AliConfig api = APIKit.getAliConfig(); //返回阿里云的AccessKey参数
	if(api == null) throw new ErrException("未配置阿里云API参数!");
	Config config = new Config();
	config.accessKeyId = api.getAppId();
	config.accessKeySecret = api.getAppSecret();
	config.endpoint = "alidns.cn-beijing.aliyuncs.com";
	return new Client(config);
}

3、第二个方法:返回指定的记录ID(RecordId)

在阿里云的SDK中,对解析记录进行修改和删除时,都需要传入 RecordId 这个参数,所以提前写一个获取记录ID的方法。

/**
 * <p>
 * 返回指定主机记录的ID,不存在时返回null
 * </p>
 *
 * @param DomainName
 * @param RR 记录名称
 * @return
 */
private String getRecId(Client client, String DomainName, String RR){
	String recId = null;
	try {
		DescribeDomainRecordsRequest request = new DescribeDomainRecordsRequest();
		request.setDomainName(DomainName);
		request.setRRKeyWord(RR);
		DescribeDomainRecordsResponse response = client.describeDomainRecords(request);
		if(response.getBody().getTotalCount() > 0){
			List<DescribeDomainRecordsResponseBodyDomainRecordsRecord> recs = response.getBody().getDomainRecords().getRecord();
			for(DescribeDomainRecordsResponseBodyDomainRecordsRecord rec: recs){
				if(rec.getRR().equalsIgnoreCase(RR)){
					recId = rec.getRecordId();
					break;
				}
			}
		}
	} catch (Exception e) {
	}
	return recId;
}

4、第三个方法:添加或修改指定的记录

方便起见,这里我将添加和修改集成到了一个方法,相当于SaveOrUpdate。

/**
 * <p>
 * 添加或修改解析记录
 * </p>
 *
 * @param DomainName 域名
 * @param RR 记录名称
 * @param Type 记录类型(A、AAAA、MX、TXT、CNAME)
 * @param Value 记录值
 */
public void update(String DomainName, String RR, String Type, String Value){
	try {
		if(EStr.isEmpty(DomainName)) throw new RuntimeException("域名(DomainName)为空!");
		if(EStr.isEmpty(RR)) throw new RuntimeException("主机记录(RR)为空!");
		if(EStr.isEmpty(Type)) throw new RuntimeException("记录类型(Type)为空!");
		if(EStr.isEmpty(Value)) throw new RuntimeException("记录值(Value)为空!");
		Client client = createClient();
		String recId = getRecId(client, DomainName, RR);
		if(EStr.isNull(recId)){ //添加
			AddDomainRecordRequest request = new AddDomainRecordRequest();
			request.setDomainName(DomainName);
			request.setRR(RR);
			request.setType(Type);
			request.setValue(Value);
			AddDomainRecordResponse response = client.addDomainRecord(request);
			recId = response.getBody().getRecordId();
		}else{ //修改
			UpdateDomainRecordRequest request = new UpdateDomainRecordRequest();
			request.setRecordId(recId);
			request.setRR(RR);
			request.setType(Type);
			request.setValue(Value);
			UpdateDomainRecordResponse response = client.updateDomainRecord(request);
			recId = response.getBody().getRecordId();
		}
		renderJson(Result.success("recId", recId));
	} catch (Exception e) {
		renderJson(Result.fail(e.getMessage()));
	}
}

5、第四个方法:删除指定的记录

这个很简单,根据查找到的RecordId直接删除即可。

/**
 * <p>
 * 删除记录
 * </p>
 *
 * @param DomainName
 * @param RR
 */
public void remove(String DomainName, String RR){
	try {
		if(EStr.isEmpty(DomainName)) throw new RuntimeException("域名(DomainName)为空!");
		if(EStr.isEmpty(RR)) throw new RuntimeException("主机记录(RR)为空!");
		Client client = createClient();
		String recId = getRecId(client, DomainName, RR);
		if(EStr.isNull(recId)){
			renderJson(Result.success("recId", null));
		}else{
			DeleteDomainRecordRequest request = new DeleteDomainRecordRequest();
			request.setRecordId(recId);
			DeleteDomainRecordResponse response = client.deleteDomainRecord(request);
			renderJson(Result.success("recId", response.getBody().getRecordId()));
		}
	} catch (Exception e) {
		renderJson(Result.fail(e.getMessage()));
	}
}

6、完整代码

01-18 09:34