api-project常用公共业务开发API文档
个人日常api-project使用样例
- api引入
- 接口签名
- 缓存工厂和它的老朋友自动更新
- LaTex数学公式
- UML序列图和流程图
- 离线写博客
- 导入导出Markdown文件
- 丰富的快捷键
api引入(Meavn)
meavn仓库地址
<repositories>
<repository>
<id>api-project-mvn-rep</id>
<url>https://raw.github.com/ccycc88/mvn-repo/master/</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
meavn依赖
<dependency>
<groupId>com.api</groupId>
<artifactId>api-project</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
接口签名
接口签名主要用于服务对外提供接口的一种安全认证。服务端为需要接口访问应用提供唯一的appId与appId对应的keyt。
应用请求服务端接口需要依据约定算法协议生成对应的签名串。服务端接收到请求参数,依据appId及对应的keyt和参与签名的参数进行认定。
签名算法
- 签名参数去除空值参数
- 依据参数名递减排序
- 将参数_name参数_val&参数_name参数_val进行连接
- 连接的字符串&keyt
- 最终字符串通过MD5生成最终签名值
创建签名串
Map<String, String> m = Maps.newHashMap();
m.put("34567", "345");
m.put("fh", "2345");
m.put("kl", "457");
String keyt = "keyt23";
String sign = ApiSignUtil.buildSign(m, keyt);
-
生成签名串
- appId与keyt为一一对应,其他参数是一些任意参数,根据业务需求。
验证签名串
Map<String, String> m = Maps.newHashMap();
m.put("34567", "345");
m.put("fh", "2345");
m.put("kl", "457");
m.put("sign", "3529D3639A445BBC9A7EFCC30543F5F5");
String keyt = "keyt23";
boolean succ = ApiSignUtil.validateSign(m,keyt);
-
生成签名串
- 通过appId获取keyt,依据请求参数和keyt进行验证请求是否合法。
缓存工厂和它的老朋友自动更新
为了应用执行效率,及缓存不可缺少的业务场景。缓存工厂通用管理缓存工具,使代码整洁易懂。在缓存的实现中你可以使用redis,memorycache或集合等待。
当然缺少不了他的老朋友自动更新。
缓存实现
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
import com.google.common.collect.Maps;
public class RuleCache extends Cache{
private static final String CACHE_PREFIX = "rule";
//保存的缓存
private Map<String, Map<String, String[]>> rcache = Maps.newHashMap();
private ReentrantLock lock = new ReentrantLock();
//初始化缓存
@Override
public void init() {
// TODO Auto-generated method stub
rcache.put("",null);
}
//用于周期性刷新缓存
@Override
public void refresh() {
// TODO Auto-generated method stub
lock.lock();
try {
rcache.clear();
rcache.put("ddd", null)
} finally {
// TODO: handle finally clause
lock.unlock();
}
}
//重写该方法用于判断是否存在
@Override
public boolean exist(String... key) throws Exception {
// TODO Auto-generated method stu