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、完整程式碼
檢視程式碼
package itez.alidns.controller;
import java.util.List;
import com.aliyun.alidns20150109.Client;
import com.aliyun.alidns20150109.models.AddDomainRecordRequest;
import com.aliyun.alidns20150109.models.AddDomainRecordResponse;
import com.aliyun.alidns20150109.models.DeleteDomainRecordRequest;
import com.aliyun.alidns20150109.models.DeleteDomainRecordResponse;
import com.aliyun.alidns20150109.models.DescribeDomainRecordsRequest;
import com.aliyun.alidns20150109.models.DescribeDomainRecordsResponse;
import com.aliyun.alidns20150109.models.DescribeDomainRecordsResponseBody.DescribeDomainRecordsResponseBodyDomainRecordsRecord;
import com.aliyun.alidns20150109.models.UpdateDomainRecordRequest;
import com.aliyun.alidns20150109.models.UpdateDomainRecordResponse;
import com.aliyun.teaopenapi.models.Config;
import itez.core.wrapper.controller.ControllerDefine;
import itez.core.wrapper.controller.EController;
import itez.kit.EStr;
import itez.kit.exception.ErrException;
import itez.kit.restful.Result;
import itez.plat.main.model.CompWx;
import itez.plat.main.service.CompWxService;
import itez.weixin.api.ApiConfigKit.ConfigType;
/**
* <p>
* 阿里雲DNS解析
* 示例:http://localhost/alidns/update?DomainName=domain.com&RR=test&Type=A&Value=8.8.8.8
* </p>
*
* <p>Copyright(C) 2017-2022 <a href="http://www.itez.com.cn">上游科技</a></p>
*
* @author <a href="mailto:netwild@qq.com">Z.Mingyu</a>
* @date 2022年1月12日 下午2:38:31
*/
@ControllerDefine(key = "/alidns", summary = "阿里雲DNS解析", view = "/")
public class AliDnsController extends EController {
/**
* <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()));
}
}
/**
* <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()));
}
}
/**
* <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;
}
/**
* <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);
}
}