一款直击痛点的优秀http框架,让我超高效完成了第三方接口的对接

本文涉及的产品
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
简介: 一款直击痛点的优秀http框架,让我超高效完成了第三方接口的对接

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 调用。

 

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 一个注解就能完成绝大多数请求的定义
  • 支持异步请求调用

 

 

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-keystore
      file: test.keystore
      keystore-pass: 123456
      cert-pass: 123456
      protocols: SSLv3

 

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

 

5. 最后

 

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

 

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

 

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

 

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

 

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

相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
26天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
102 3
|
2月前
|
前端开发 JavaScript 中间件
前端全栈之路Deno篇(四):Deno2.0如何快速创建http一个 restfulapi/静态文件托管应用及oak框架介绍
Deno 是由 Node.js 创始人 Ryan Dahl 开发的新一代 JavaScript 和 TypeScript 运行时,旨在解决 Node.js 的设计缺陷,具备更强的安全性和内置的 TypeScript 支持。本文介绍了如何使用 Deno 内置的 `Deno.serve` 快速创建 HTTP 服务,并详细讲解了 Oak 框架的安装和使用方法,包括中间件、路由和静态文件服务等功能。Deno 和 Oak 的结合使得创建 RESTful API 变得高效且简便,非常适合快速开发和部署现代 Web 应用程序。
105 2
|
2月前
|
JSON Java fastjson
Java Http 接口对接太繁琐?试试 UniHttp 框架吧
UniHttp 是一个声明式的 HTTP 接口对接框架,旨在简化第三方 HTTP 接口的调用过程。通过注解配置,开发者可以像调用本地方法一样发起 HTTP 请求,无需关注请求的构建和响应处理细节。框架支持多种请求方式和参数类型,提供灵活的生命周期钩子以满足复杂的对接需求,适用于企业级项目的快速开发和维护。GitHub 地址:[UniAPI](https://github.com/burukeYou/UniAPI)。
|
3月前
|
存储 JSON Go
在Gin框架中优雅地处理HTTP请求体中的JSON数据
在Gin框架中优雅地处理HTTP请求体中的JSON数据
|
2月前
|
Java 数据处理 开发者
Java Http 接口对接太繁琐?试试 UniHttp 框架~
【10月更文挑战第10天】在企业级项目开发中,HTTP接口对接是一项常见且重要的任务。传统的编程式HTTP客户端(如HttpClient、Okhttp)虽然功能强大,但往往需要编写大量冗长且复杂的代码,这对于项目的可维护性和可读性都是一个挑战。幸运的是,UniHttp框架的出现为这一问题提供了优雅的解决方案。
89 0
|
5月前
|
网络协议 Dubbo Java
什么是RPC?RPC和HTTP对比?RPC有什么缺点?市面上常用的RPC框架?
选择合适的RPC框架和通信协议,对于构建高效、稳定的分布式系统至关重要。开发者需要根据自己的业务需求和系统架构,综合考虑各种因素,做出适宜的技术选型。
493 1
|
Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
总结和计划总是让人喜悦或镇痛,一方面以前一段时间没有荒废,能给现在的行动以信心,另一方面看到一年的时间并不能完成很多事情,需要抓紧时间。
617 0
|
Web App开发 监控 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
系统的升级涉及各个架构组件,细节很多。常年累月的修修补补使老系统积累了很多问题。 系统升级则意味着需要repair之前埋下的雷,那为何还要升级,可以考虑以下几个方面 成熟老系统常见问题: 1. 缺乏文档(这应该是大小公司都存在的问题。
625 0
|
Java Apache
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
hbase从集群中有8台regionserver服务器,已稳定运行了5个多月,8月15号,发现集群中4个datanode进程死了,经查原因是内存 outofMemory了(因为这几台机器上部署了spark,给spark开的...
812 0