- 最近工作中有大量调用客户接口的工作,刚开始按照硬编码的写法还能应付过来,等到大几十个不同功能的接口这种写法显得力不从心,即使过程中进行了一些封装满足了大部分接口的管理(暂时管这种写法叫01版本吧),可是后面逐渐增加的接口让这种写法捉襟见肘,此时感觉到压力,发现自己的设计能力也和01版本一样达到了上限,也正是因于此吧自己的好胜心被勾起来了,接下来的几天一直在寻求更合适的方式,不过寻求方向是在01版本基础上进行的,尝试很多种办法最终结果都会导致满足需求的功能冗余且无法扩展,即使满足了现有的全部接口的场景,谁能保证后面有没有新的场景呢,这时发现01版本确实不适合这种功能了,但是现在已经有很多接口使用这种方式了,后期改的话会很麻烦,这怎么能行,后面的几天一直在想着这件事,直到有一天自己在写业务代码时看见SQL语句的管理方式,都是利用xml进行管理,这时突然来了灵感。SQL的执行协议是jdbc:xxx://ip:port/xxx,这不是和http方式如出一辙嘛,豁然开朗,将xml中的sql语句换成接口地址,执行引擎换成http协议。
- 现在大方向有了,接下来的工作就是扣细节了。首先mybatis管理sql的xml数据结构方式不满足这个场景需要改一下,其次就是将jdbc的执行方式替换成http执行方式。
先说一下大致步骤:
- xml数据格式的定义
<url id="test" request-method="GET">
<description>百度首页</description>
<request-url>https://www.baidu.com/</request-url>
<heads>
<head key="Content-Type" value="multipart/form-data"/>
</heads>
<params>-->
<property key="name" value="小明"/>
<property key="age" value="22"/>
</params>
<response-body>
<body>data</body>
</response-body>
</url>
- xml的读取及解析: XmlUrlDefinitionReader
@Override
public void loadUrlDefinitions(String urlLocations) throws UrlException {
try {
PathMatchingResourcePatternResolver resourceLoader = getResourceLoader();
Resource[] resources = resourceLoader.getResources(urlLocations);
for (Resource resource : resources) {
parseXml(resource);
}
} catch (Exception e) {
throw new UrlException("Xml parsed failed!", e);
}
}
3. 接口的调用与执行:DefaultUrlSession
```java
@Override
public <K, V> Map<K, V> selectMap(String statement, Map<String, Object> urlParam, Map<String, Object> urlHeads) {
Object resultData = getResultData(statement, urlParam, urlHeads);
return (Map<K, V>) resultData;
}
- Java版本使用案例
UrlRegistry registry = new UrlRegistry();
XmlUrlDefinitionReader reader = new XmlUrlDefinitionReader(registry);
reader.loadUrlDefinitions("classpath*:config/urls/**/*.xml");
DefaultUrlSession session = new DefaultUrlSession(registry);
Map<String, Object> param = new HashMap<>();
param.put("type", 2);
Map<Object, Object> selectMap = session.selectMap("TEST.test", param);
System.out.println(selectMap);
- Spring版本使用案例
// simple-http框架jar包,需要你打包到本地仓库,或者上传到远程仓库
<dependency>
<groupId>com.struggle.http</groupId>
<artifactId>simple-http</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.10.RELEASE</version>
</dependency>
## xml path
sync.url-locations=classpath*:urls