点击上方“方志朋”,选择“设为星标”

回复”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框架,让我超高效率完成了和第三方接口的对接相关推荐

  1. Duang!Duang!Duang!直击痛点的一款 HTTP 客户端框架(Java),墙裂推荐!

    大家好,我是二哥呀! 今天来给大家推荐一款直击痛点的 HTTP 客户端框架,可以超高效率地完成和第三方接口的对接. 在介绍本篇的主角之前,我们先来了解下 Java 生态中的 HTTP 组件库,大致可以 ...

  2. 推荐25款很棒的 HTML5 前端框架和开发工具【下篇】

    快速,安全,响应式,互动和美丽,这些优点吸引更多的 Web 开发人员使用 HTML5.HTML5 有许多新的特性功能,允许开发人员和设计师创建应用程序和网站,带给用户桌面应用程序的速度,性能和体验. ...

  3. Android 2018优秀开源框架整理收藏

    中级.高级.资深工程师 知其然知其不可然 <框架百大排行榜>里所提到的流行词.流行术语--使用能力.融会贯通其原理.讲解框架能力的高低,将让你不断的在这三个级别徘徊: 会有意识的合并榜单里 ...

  4. Android优秀开源框架集

    Android优秀开源框架介绍 开篇 网络请求框架 1. okhttp 2. retrofit 3. android-async-http android图表框架 4. MPAndroidChart ...

  5. 国产首款——飞桨PaddlePaddle深度学习框架介绍

    现在深度学习框架不但内卷严重,而且头部效应明显.一提起深度学习框架,首先想到的肯定是Google家的TensorFlow,和Facebook家的PyTorch.究竟排名谁先谁后,还要看你是工业界还是学 ...

  6. 世界最流行的php框架排名_推荐20个最近很流行的优秀PHP框架

    对于Web开发者来说,PHP是一款非常强大而又受欢迎的编程语言.世界上很多顶级的网站都是基于PHP开发的.本文我们来回顾一下20个2014年最优秀的PHP框架. 每一个开发者都知道,拥有一个强大的框架 ...

  7. 六款值得推荐的Android开源框架简介

    六款值得推荐的Android开源框架简介 技术不再多,知道一些常用的.不错的就够了.下面就是最近整理的"性价比"比较高的Android开源框架,应该是相对实用的. 1.volley ...

  8. 再见Spring Security!推荐一款功能强大的权限认证框架,用起来够优雅!

    ‍ ‍在我们做SpringBoot项目的时候,认证授权是必不可少的功能!我们经常会选择Shiro.Spring Security这类权限认证框架来实现,但这些框架使用起来有点繁琐,而且功能也不够强大. ...

  9. 最流行的轻量级php框架,推荐20个最近很流行的优秀PHP框架

    11.Fuel PHP Fuel PHP是一款简单.可扩展的PHP框架,基于其他框架的设计理念,Fuel已经是V2.0版本了,目前认识beta版本. Fuel全面支持HMVC,这也是Fuel架构的一部 ...

最新文章

  1. LeetCode简单题之位1的个数
  2. 番茄工作法发明人作序推荐《番茄工作法图解》
  3. cef在android中使用_嵌入Chrome cef之完整版(本教程基于cef1)
  4. 【Paper】2017_Limit-Cycle-Based Decoupled Design of Circle Formation Control with Collision Avoidance
  5. 岗位推荐 | 京东AI研究院招聘计算机视觉算法实习生
  6. android访问重定向地址,如何从android中重定向url加载图像(示例代码)
  7. C#如何用Graphics画出一幅图表
  8. C++字符串的不同存放类型 (string/char[])
  9. django配置邮件服务器,python – 使用Bluehost电子邮件服务器的Django电子邮件配置...
  10. Redis 最大客户端连接数,你了解吗?
  11. selenium.common.exceptions.WebDriverException: Message: Can't load the profile.
  12. 通过PyMuPDF编写增值税发票多PDF文件合并工具
  13. mysql完整性实验报告_MySQL数据库技术实验报告模板
  14. 【牛客网】养兔子(斐波那契数列)
  15. 化工虚拟仿真实验室实训操作软件搭建
  16. linux pclint配置_PC-lint
  17. 园区网典型组网架构及案例实践
  18. 计算机二级web题型及分值,2016年全国计算机二级《Web程序设计》考试大纲
  19. window专业版激活
  20. UNIX 时间戳总结

热门文章

  1. Mybatis常见面试题(三)
  2. c# yield关键字原理
  3. LInkedHashMap实现最近被使用(LRU)缓存
  4. idea配置echache.xml报错Cannot resolve file 'ehcache.xsd'
  5. 20160722noip模拟赛alexandrali
  6. 为python安装numpy和scipy(federo)
  7. javascript中FORM表单的submit()方法经验教训.
  8. 【组队学习】【29期】5. 李宏毅机器学习(含深度学习)
  9. 如何利用 C# 实现 K-D Tree 结构?
  10. 【Codeforces】1104C Grid game (变异的俄罗斯方块)