文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

一款优秀、开源的 http 框架

2024-12-03 00:41

关注

不同的公司API规范不一样,这很正常。但是对于我来说,我如果想要代码变得优雅。我就必须解决一个痛点:

不同服务商API那么多的差异点,如何才能维护一套不涉及业务的公共http调用套件。最好通过配置或者简单的参数就能区分开来。进行方便的调用?

我当然知道有很多优秀的大名鼎鼎的http开源框架可以实现任何形式的http调用,在多年的开发经验中我都有使用过。比如apache的httpClient包,非常优秀的Okhttp,jersey client。

这些http开源框架的接口使用相对来说,都不太一样。不管选哪个,在我这个场景里来说,我都不希望在调用每个第三方的http api时写上一堆http调用代码。

所以,在这个场景里,我得对每种不同的http api进行封装。这样的代码才能更加优雅,业务代码和http调用逻辑耦合度更低。

可惜,我比较懒。一来觉得封装起来比较费时间,二来觉对封装这种底层http调用来说,应该有更好的选择。不想自己再去造轮子。

于是,我发现了一款优秀的开源http框架,能屏蔽不同细节http api所带来的所有差异。能通过简单的配置像调用rpc框架一样的去完成极为复杂的http调用。

https://gitee.com/dromara/forest

上手

Forest支持了Springboot的自动装配,所以只需要引入一个依赖就行 

  1. <dependency>  
  2.   <groupId>com.dtflys.forestgroupId>  
  3.   <artifactId>spring-boot-starter-forestartifactId>  
  4.   <version>1.3.0version>  
  5. dependency>  
  6. ```java  
  7. 定义自己的接口类  
  1. public interface MyClient {  
  2. @Request(url = "http://baidu.com" 
  3. String simpleRequest();  
  4. @Request(  
  5.         url = "http://ditu.amap.com/service/regeo" 
  6.         dataType = "json"  
  7.  
  8. Map getLocation(@DataParam("longitude") String longitude, @DataParam("latitude") String latitude);  
  9.  
  1. 在启动类里配置代理接口类的扫描包  
  2. ```jva  
  3. @SpringBootApplication  
  4. @ForestScan(basePackages = "com.example.demo.forest" 
  5. public class DemoApplication {  
  6.     public static void main(String[] args) {  
  7.         SpringApplication.run(DemoApplication.class, args);  
  8.     }  

这时候,你就可以从spring容器中注入你的代理接口,像调用本地方法一样去调用http的api了 

  1. @Autowired  
  2. private MyClient myClient;  
  3. @Override  
  4. public void yourMethod throws Exception {  
  5.     Map result = myClient.getLocation("124.730329","31.463683");  
  6.     System.out.println(JSON.toJSONString(result,true));  

日志打印,Forest打印了内部所用的http框架,和实际请求url和返回。当然日志可以通过配置去控制开关。

特点

我觉得对于尤其是做对接第三方api的开发同学来说,这款开源框架能帮你提高很多效率。

Forest 底层封装了2种不同的http框架:Apache httpClient和OKhttp。所以这个开源框架并没有对底层实现进行重复造轮子,而是在易用性上面下足了功夫。

我用Forest最终完成了和多个服务商api对接的项目,这些风格迥异的API,我仅用了1个小时时间就把他们转化为了本地方法。然后项目顺利上线。

Forest作为一款更加高层的http框架,其实你并不需要写很多代码,大多数时候,你仅通过一些配置就能完成http的本地化调用。而这个框架所能覆盖的面,却非常之广,满足你绝大多数的http调用请求。

Forest有以下特点:

两个很棒的功能

这里不对使用方式和配置方式一一描述,有兴趣的可以去阅读详细文档:

http://forest.dtflyx.com/

这里只想分析这个框架2个我认为比较好的功能

模板表达式在使用的时候特别方便,举个栗子 

  1. @Request(  
  2.     url = "${0}/send?un=${1}&pw=${2}&ph=${3}&ct=${4}" 
  3.     type = "get" 
  4.     dataType = "json"  
  5.  
  6. public Map send(  
  7.     String base,  
  8.     String userName,  
  9.     String password,  
  10.     String phone,  
  11.     String content  
  12. ); 

上述是用序号下标进行取值,也可以通过名字进行取值: 

  1. @Request(  
  2.     url = "${base}/send?un=${un}&pw=${pw}&ph=${3}&ct=${ct}" 
  3.     type = "get" 
  4.     dataType = "json"  
  5.  
  6. public Map send(  
  7.     @DataVariable("base") String base,  
  8.     @DataVariable("un") String userName,  
  9.     @DataVariable("pw") String password,  
  10.     @DataVariable("ph") String phone, 
  11.     @DataVariable("ct") String content  
  12. ); 

甚至于可以这样简化写: 

  1. @Request(  
  2.     url = "${base}/send" 
  3.     type = "get" 
  4.     dataType = "json"  
  5.  
  6. public Map send(  
  7.     @DataVariable("base") String base,  
  8.     @DataParam("un") String userName,  
  9.     @DataParam("pw") String password,  
  10.     @DataParam("ph") String phone, 
  11.     @DataParam("ct") String content  
  12. ); 

以上三种写法是等价的

当然你也可以把参数绑定到header和body里去,你甚至于可以用一些表达式简单的把对象序列化成json或者xml: 

  1. @Request( 
  2.     url = "${base}/pay" 
  3.    contentType = "application/json" 
  4.     type = "post" 
  5.     dataType = "json" 
  6.     headers = {"Authorization: ${1}"},  
  7.     data = "${json($0)}"  
  8.  
  9. public PayResponse pay(PayRequest request, String auth); 

当然数据绑定这块详情请参阅文档

以前用其他http框架处理https的时候,总觉得特别麻烦,尤其是双向证书。每次碰到问题也只能去baidu。然后根据别人的经验来修改自己的代码。

Forest对于这方面也想的很周到,底层完美封装了对https单双向证书的支持。也是只要通过简单的配置就能迅速完成。举个双向证书栗子: 

  1. @Request(  
  2.     url = "${base}/pay" 
  3.    contentType = "application/json" 
  4.     type = "post" 
  5.     dataType = "json" 
  6.    keyStore = "pay-keystore" 
  7.    data = "${json($0)}"  
  8.  
  9. public PayResponse pay(PayRequest request); 

其中pay-keystore对应着application.yml里的ssl-key-stores 

  1. forest:  
  2.   ...  
  3.   ssl-key-stores:  
  4.     - id: pay-keystore  
  5.       file: test.keystore  
  6.       keystore-pass: 123456  
  7.       cert-pass: 123456  
  8.       protocols: SSLv3 

这样设置,就ok了,剩下的,就是本地代码形式的调用了。

最后

Forest有很多其他的功能设定,如果感兴趣的同学还请仔细去阅读文档和示例。

但是我想说的是,相信看到这里,很多人一定会说,这不就是Feign吗?

我在开发Spring Cloud项目的时候,也用过一段时间Feign,个人感觉Forest的确在配置和用法上和Feign的设计很像,但Feign的角色更多是作为Spring Cloud生态里的一个成员。充当RPC通信的角色,其承担的不仅是http通讯,还要对注册中心下发的调用地址进行负载均衡。

而Forest这个开源项目其定位则是一个高阶的http工具,主打友好和易用性。从使用角度出发,个人感觉Forest配置性更加简单直接。提供的很多功能也能解决很多人的痛点。

开源精神难能可贵,好的开源需要大家的添砖加瓦和支持。希望这篇文章能给大家在选择http客户端框架时带来一个新的选择:Forest 

 

来源:民工哥技术之路内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯