还在为调用API接口而烦恼吗,试试这款框架

99 阅读3分钟
  • 最近工作中有大量调用客户接口的工作,刚开始按照硬编码的写法还能应付过来,等到大几十个不同功能的接口这种写法显得力不从心,即使过程中进行了一些封装满足了大部分接口的管理(暂时管这种写法叫01版本吧),可是后面逐渐增加的接口让这种写法捉襟见肘,此时感觉到压力,发现自己的设计能力也和01版本一样达到了上限,也正是因于此吧自己的好胜心被勾起来了,接下来的几天一直在寻求更合适的方式,不过寻求方向是在01版本基础上进行的,尝试很多种办法最终结果都会导致满足需求的功能冗余且无法扩展,即使满足了现有的全部接口的场景,谁能保证后面有没有新的场景呢,这时发现01版本确实不适合这种功能了,但是现在已经有很多接口使用这种方式了,后期改的话会很麻烦,这怎么能行,后面的几天一直在想着这件事,直到有一天自己在写业务代码时看见SQL语句的管理方式,都是利用xml进行管理,这时突然来了灵感。SQL的执行协议是jdbc:xxx://ip:port/xxx,这不是和http方式如出一辙嘛,豁然开朗,将xml中的sql语句换成接口地址,执行引擎换成http协议。
  • 现在大方向有了,接下来的工作就是扣细节了。首先mybatis管理sql的xml数据结构方式不满足这个场景需要改一下,其次就是将jdbc的执行方式替换成http执行方式。 先说一下大致步骤:
    1. 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>
    <!--   响应数据:元素body表示只返回data属性下的数据     -->
    <response-body>
        <body>data</body>
    </response-body>
</url>
  1. xml的读取及解析: XmlUrlDefinitionReader
   @Override
   public void loadUrlDefinitions(String urlLocations) throws UrlException {
       try {
           PathMatchingResourcePatternResolver resourceLoader = getResourceLoader();
               Resource[] resources = resourceLoader.getResources(urlLocations);
               for (Resource resource : resources) {
                   // 将xml信息解析并保存起来
                   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) {
       // http执行结果
       Object resultData = getResultData(statement, urlParam, urlHeads);
       return (Map<K, V>) resultData;
   }
  1. Java版本使用案例
    // 1. 解析xml
    UrlRegistry registry = new UrlRegistry();
    XmlUrlDefinitionReader reader = new XmlUrlDefinitionReader(registry);
    // 设置要读取的xml    
    reader.loadUrlDefinitions("classpath*:config/urls/**/*.xml");
    // 默认session
    DefaultUrlSession session = new DefaultUrlSession(registry);
    Map<String, Object> param = new HashMap<>();
    param.put("type", 2);
    // TEST就是xml文件类型,test是要调用的id,二者能保证唯一调用
    Map<Object, Object> selectMap = session.selectMap("TEST.test", param);
    System.out.println(selectMap);
  1. 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>
    // 配置文件:application.properties
    ## xml path
    sync.url-locations=classpath*:urls/**/*.xml

        
    // org.example.mapper路径是我们的映射文件和mybatis的mapper文件原理相同
    @Component
    @UrlScan("org.example.mapper")
    public class AppConfig {
    }


    // 启动类
    @SpringBootApplication
    // "com.struggle.http" 路径是simple-http框架的代码路径
    @ComponentScan(basePackages = {"org.example", "com.struggle.http"})
    public class Main {
        public static void main(String[] args) {
            SpringApplication.run(Main.class, args);
        }
    }