您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

JAVA实现对阿里云DNS的解析管理

时间:2022-01-19 11:46:13  来源:  作者:顶顶架构师

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);
	}
	
}


Tags:阿里云DNS   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1、阿里云DNS的SDK依赖<dependency> <groupId>com.aliyun</groupId> <artifactId>tea-openapi</artifactId> <version>0.0.19</version></dependency><dependency> <groupId...【详细内容】
2022-01-19  Tags: 阿里云DNS  点击:(0)  评论:(0)  加入收藏
▌简易百科推荐
1、阿里云DNS的SDK依赖<dependency> <groupId>com.aliyun</groupId> <artifactId>tea-openapi</artifactId> <version>0.0.19</version></dependency><dependency> <groupId...【详细内容】
2022-01-19  顶顶架构师    Tags:阿里云DNS   点击:(0)  评论:(0)  加入收藏
Maven是Java的项目配置管理工具,用来管理依赖,具体的用途就不展开说了。大部分项目,配置一个镜像仓库地址就可以了(单个mirror)。但是有的网上下载的项目需要从多个仓库查找对应...【详细内容】
2022-01-14  阿福ChrisYuan    Tags:Maven配置   点击:(7)  评论:(0)  加入收藏
闰年闰年(Leap Year)是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。补上时间差的年份为闰年。闰年共有366天(1月~12月分别为31天、29天、31天、...【详细内容】
2022-01-11  3班的黄同学    Tags:   点击:(9)  评论:(0)  加入收藏
目录4、TCP网络传输的基本流程二、网络编程套接字(socket)5、cookie和session的用法6、基本实现http协议的代码四、传输层协议TCP和UDP4、TCP和UDP之间的对比六、数据链路层和...【详细内容】
2022-01-04  顶顶架构师    Tags:JAVA   点击:(15)  评论:(0)  加入收藏
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  顶顶架构师    Tags:面向对象   点击:(16)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(31)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(25)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(27)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(40)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(22)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条