时间:2023-01-12 12:39:44 | 栏目:JAVA代码 | 点击:次
<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>
所有解析记录的操作都要通过这个客户端实例来进行,所以要首先创建这个实例,需要阿里云的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); }
在阿里云的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; }
方便起见,这里我将添加和修改集成到了一个方法,相当于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())); } }
这个很简单,根据查找到的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())); } }
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); } }