一款直击痛点的优秀http框架,让我超高效率完成了和第三方接口的对接
点击上方“方志朋”,选择“设为星标”
回复”666“获取新整理的面试文章
作者:元人部落
cnblogs.com/bryan31/p/13359376.html
1.背景
因为业务关系,要和许多不同第三方公司进行对接。这些服务商都提供基于http的api。但是每家公司提供api具体细节差别很大。有的基于RESTFUL规范,有的基于传统的http规范;有的需要在header里放置签名,有的需要SSL的双向认证,有的只需要SSL的单向认证;有的以JSON 方式进行序列化,有的以XML方式进行序列化。类似于这样细节的差别太多了。
不同的公司API规范不一样,这很正常。但是对于我来说,我如果想要代码变得优雅。我就必须解决一个痛点:
不同服务商API那么多的差异点,如何才能维护一套不涉及业务的公共http调用套件。最好通过配置或者简单的参数就能区分开来。进行方便的调用?
我当然知道有很多优秀的大名鼎鼎的http开源框架可以实现任何形式的http调用,在多年的开发经验中我都有使用过。比如apache的httpClient包,非常优秀的Okhttp,jersey client。
这些http开源框架的接口使用相对来说,都不太一样。不管选哪个,在我这个场景里来说,我都不希望在调用每个第三方的http api时写上一堆http调用代码。
所以,在这个场景里,我得对每种不同的http api进行封装。这样的代码才能更加优雅,业务代码和http调用逻辑耦合度更低。
可惜,我比较懒。一来觉得封装起来比较费时间,二来觉对封装这种底层http调用来说,应该有更好的选择。不想自己再去造轮子。
于是,我发现了一款优秀的开源http框架,能屏蔽不同细节http api所带来的所有差异。能通过简单的配置像调用rpc框架一样的去完成极为复杂的http调用。
面试题推荐:100期面试题汇总
Forest
https://gitee.com/dt_flys/forest
2.上手
Forest支持了Springboot的自动装配,所以只需要引入一个依赖就行
<dependency><groupId>com.dtflys.forest</groupId><artifactId>spring-boot-starter-forest</artifactId><version>1.3.0</version>
</dependency>
定义自己的接口类
public interface MyClient {@Request(url = "http://baidu.com")String simpleRequest();@Request(url = "http://ditu.amap.com/service/regeo",dataType = "json")Map getLocation(@DataParam("longitude") String longitude, @DataParam("latitude") String latitude);}
在启动类里配置代理接口类的扫描包
@SpringBootApplication
@ForestScan(basePackages = "com.example.demo.forest")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
这时候,你就可以从spring容器中注入你的代理接口,像调用本地方法一样去调用http的api了
@Autowired
private MyClient myClient;@Override
public void yourMethod throws Exception {Map result = myClient.getLocation("124.730329","31.463683");System.out.println(JSON.toJSONString(result,true));
}
日志打印,Forest打印了内部所用的http框架,和实际请求url和返回。当然日志可以通过配置去控制开关。
3.特点
我觉得对于尤其是做对接第三方api的开发同学来说,这款开源框架能帮你提高很多效率。
Forest 底层封装了2种不同的http框架:Apache httpClient和OKhttp。所以这个开源框架并没有对底层实现进行重复造轮子,而是在易用性上面下足了功夫。
我用Forest最终完成了和多个服务商api对接的项目,这些风格迥异的API,我仅用了1个小时时间就把他们转化为了本地方法。然后项目顺利上线。
Forest作为一款更加高层的http框架,其实你并不需要写很多代码,大多数时候,你仅通过一些配置就能完成http的本地化调用。而这个框架所能覆盖的面,却非常之广,满足你绝大多数的http调用请求。
Forest有以下特点:
以Httpclient和OkHttp为后端框架
通过调用本地方法的方式去发送Http请求, 实现了业务逻辑与Http协议之间的解耦
相比Feign更轻量,不依赖Spring Cloud和任何注册中心
支持所有请求方法:GET, HEAD, OPTIONS, TRACE, POST, DELETE, PUT, PATCH
支持灵活的模板表达式
支持过滤器来过滤传入的数据
基于注解、配置化的方式定义Http请求
支持Spring和Springboot集成
实现JSON和XML的序列化和反序列化
支持JSON转换框架: Fastjson,Jackson, Gson
支持JAXB形式的XML转换
支持SSL的单向和双向加密
支持http连接池的设定
可以通过OnSuccess和OnError接口参数实现请求结果的回调
配置简单,一般只需要@Request一个注解就能完成绝大多数请求的定义
支持异步请求调用
面试题推荐:100期面试题汇总
4.两个很棒的功能
这里不对使用方式和配置方式一一描述,有兴趣的可以去阅读详细文档:
https://dt_flys.gitee.io/forest
这里只想分析这个框架2个我认为比较好的功能
4.1 模板表达式和参数的映射绑定功能
模板表达式在使用的时候特别方便,举个栗子
@Request(url = "${0}/send?un=${1}&pw=${2}&ph=${3}&ct=${4}",type = "get",dataType = "json"
)
public Map send(String base,String userName,String password,String phone,String content
);
上述是用序号下标进行取值,也可以通过名字进行取值:
@Request(url = "${base}/send?un=${un}&pw=${pw}&ph=${3}&ct=${ct}",type = "get",dataType = "json"
)
public Map send(@DataVariable("base") String base,@DataVariable("un") String userName,@DataVariable("pw") String password,@DataVariable("ph") String phone,@DataVariable("ct") String content
);
甚至于可以这样简化写:
@Request(url = "${base}/send",type = "get",dataType = "json"
)
public Map send(@DataVariable("base") String base,@DataParam("un") String userName,@DataParam("pw") String password,@DataParam("ph") String phone,@DataParam("ct") String content
);
以上三种写法是等价的
当然你也可以把参数绑定到header和body里去,你甚至于可以用一些表达式简单的把对象序列化成json或者xml:
@Request(url = "${base}/pay",contentType = "application/json",type = "post",dataType = "json",headers = {"Authorization: ${1}"},data = "${json($0)}"
)
public PayResponse pay(PayRequest request, String auth);
当然数据绑定这块详情请参阅文档
4.2 对HTTPS的支持
以前用其他http框架处理https的时候,总觉得特别麻烦,尤其是双向证书。每次碰到问题也只能去baidu。然后根据别人的经验来修改自己的代码。
Forest对于这方面也想的很周到,底层完美封装了对https单双向证书的支持。也是只要通过简单的配置就能迅速完成。举个双向证书栗子:
@Request(url = "${base}/pay",contentType = "application/json",type = "post",dataType = "json",keyStore = "pay-keystore",data = "${json($0)}"
)
public PayResponse pay(PayRequest request);
其中pay-keystore对应着application.yml里的ssl-key-stores
forest:...ssl-key-stores:- id: pay-keystorefile: test.keystorekeystore-pass: 123456cert-pass: 123456protocols: SSLv3
这样设置,就ok了,剩下的,就是本地代码形式的调用了。
5.最后
Forest有很多其他的功能设定,如果感兴趣的同学还请仔细去阅读文档和示例。
但是我想说的是,相信看到这里,很多人一定会说,这不就是Feign吗?
我在开发Spring Cloud项目的时候,也用过一段时间Feign,个人感觉Forest的确在配置和用法上和Feign的设计很像,但Feign的角色更多是作为Spring Cloud生态里的一个成员。充当RPC通信的角色,其承担的不仅是http通讯,还要对注册中心下发的调用地址进行负载均衡。
而Forest这个开源项目其定位则是一个高阶的http工具,主打友好和易用性。从使用角度出发,个人感觉Forest配置性更加简单直接。提供的很多功能也能解决很多人的痛点。
开源精神难能可贵,好的开源需要大家的添砖加瓦和支持。希望这篇文章能给大家在选择http客户端框架时带来一个新的选择:Forest
热门内容:总在说SpringBoot内置了tomcat启动,那它的原理你说的清楚吗?
Hutool,一个贼好用的 Java 工具类库,用过都说好~记一次由Redis分布式锁造成的重大事故,避免以后踩坑!
面试官扎心一问:数据量很大,分页查询很慢,有什么优化方案?你说,一个Java字符串到底有多少个字符?
在Java项目中打印错误日志的正确姿势,排查问题更方便,非常实用!最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ
一款直击痛点的优秀http框架,让我超高效率完成了和第三方接口的对接相关推荐
- Duang!Duang!Duang!直击痛点的一款 HTTP 客户端框架(Java),墙裂推荐!
大家好,我是二哥呀! 今天来给大家推荐一款直击痛点的 HTTP 客户端框架,可以超高效率地完成和第三方接口的对接. 在介绍本篇的主角之前,我们先来了解下 Java 生态中的 HTTP 组件库,大致可以 ...
- 推荐25款很棒的 HTML5 前端框架和开发工具【下篇】
快速,安全,响应式,互动和美丽,这些优点吸引更多的 Web 开发人员使用 HTML5.HTML5 有许多新的特性功能,允许开发人员和设计师创建应用程序和网站,带给用户桌面应用程序的速度,性能和体验. ...
- Android 2018优秀开源框架整理收藏
中级.高级.资深工程师 知其然知其不可然 <框架百大排行榜>里所提到的流行词.流行术语--使用能力.融会贯通其原理.讲解框架能力的高低,将让你不断的在这三个级别徘徊: 会有意识的合并榜单里 ...
- Android优秀开源框架集
Android优秀开源框架介绍 开篇 网络请求框架 1. okhttp 2. retrofit 3. android-async-http android图表框架 4. MPAndroidChart ...
- 国产首款——飞桨PaddlePaddle深度学习框架介绍
现在深度学习框架不但内卷严重,而且头部效应明显.一提起深度学习框架,首先想到的肯定是Google家的TensorFlow,和Facebook家的PyTorch.究竟排名谁先谁后,还要看你是工业界还是学 ...
- 世界最流行的php框架排名_推荐20个最近很流行的优秀PHP框架
对于Web开发者来说,PHP是一款非常强大而又受欢迎的编程语言.世界上很多顶级的网站都是基于PHP开发的.本文我们来回顾一下20个2014年最优秀的PHP框架. 每一个开发者都知道,拥有一个强大的框架 ...
- 六款值得推荐的Android开源框架简介
六款值得推荐的Android开源框架简介 技术不再多,知道一些常用的.不错的就够了.下面就是最近整理的"性价比"比较高的Android开源框架,应该是相对实用的. 1.volley ...
- 再见Spring Security!推荐一款功能强大的权限认证框架,用起来够优雅!
在我们做SpringBoot项目的时候,认证授权是必不可少的功能!我们经常会选择Shiro.Spring Security这类权限认证框架来实现,但这些框架使用起来有点繁琐,而且功能也不够强大. ...
- 最流行的轻量级php框架,推荐20个最近很流行的优秀PHP框架
11.Fuel PHP Fuel PHP是一款简单.可扩展的PHP框架,基于其他框架的设计理念,Fuel已经是V2.0版本了,目前认识beta版本. Fuel全面支持HMVC,这也是Fuel架构的一部 ...
最新文章
- LeetCode简单题之位1的个数
- 番茄工作法发明人作序推荐《番茄工作法图解》
- cef在android中使用_嵌入Chrome cef之完整版(本教程基于cef1)
- 【Paper】2017_Limit-Cycle-Based Decoupled Design of Circle Formation Control with Collision Avoidance
- 岗位推荐 | 京东AI研究院招聘计算机视觉算法实习生
- android访问重定向地址,如何从android中重定向url加载图像(示例代码)
- C#如何用Graphics画出一幅图表
- C++字符串的不同存放类型 (string/char[])
- django配置邮件服务器,python – 使用Bluehost电子邮件服务器的Django电子邮件配置...
- Redis 最大客户端连接数,你了解吗?
- selenium.common.exceptions.WebDriverException: Message: Can't load the profile.
- 通过PyMuPDF编写增值税发票多PDF文件合并工具
- mysql完整性实验报告_MySQL数据库技术实验报告模板
- 【牛客网】养兔子(斐波那契数列)
- 化工虚拟仿真实验室实训操作软件搭建
- linux pclint配置_PC-lint
- 园区网典型组网架构及案例实践
- 计算机二级web题型及分值,2016年全国计算机二级《Web程序设计》考试大纲
- window专业版激活
- UNIX 时间戳总结
热门文章
- Mybatis常见面试题(三)
- c# yield关键字原理
- LInkedHashMap实现最近被使用(LRU)缓存
- idea配置echache.xml报错Cannot resolve file 'ehcache.xsd'
- 20160722noip模拟赛alexandrali
- 为python安装numpy和scipy(federo)
- javascript中FORM表单的submit()方法经验教训.
- 【组队学习】【29期】5. 李宏毅机器学习(含深度学习)
- 如何利用 C# 实现 K-D Tree 结构?
- 【Codeforces】1104C Grid game (变异的俄罗斯方块)