SpringBoot使用轻量级HTTP请求工具Forest
前言:最近在做某些功能的时候需要使用到别的公司的服务,并请求他们提供的接口,已经有很多成熟的HTTP请求框架,比如apache的httpClient包,非常优秀的Okhttp,spring提供的RestTemplate,接口很多的情况下在使用时会发现所有的接口需要写大量的http请求配置信息,申明请求体,返回类型,请求参数,请求头,然后再写业务代码时可读性降低,http请求的代码和业务代码解耦增加,所以找到一款可以方便调用接口的框架——Forest,他只是在原有基础上重复造轮子,实际上是调用接口时干脏活累活的一个实现类, 方便请求和管理大量的HTTP请求信息。
一、官网
http://forest.dtflyx.com/docs/
二、介绍
Forest 是一个开源的 Java HTTP 客户端框架,它能够将 HTTP 的所有请求信息(包括 URL、Header 以及 Body 等信息)绑定到您自定义的 Interface 方法上,能够通过调用本地接口方法的方式发送 HTTP 请求。
使用Forest的优点:
- 以
Httpclient
和OkHttp
为后端框架 - 通过调用本地方法的方式去发送Http请求, 实现了业务逻辑与Http协议之间的解耦
- 相比Feign更轻量,不依赖
Spring Cloud
和任何注册中心 (Feign) - 支持所有请求方法:
GET
,HEAD
,OPTIONS
,TRACE
,POST
,DELETE
,PUT
,PATCH
- 支持灵活的模板表达式
- 支持过滤器来过滤传入的数据
- 基于注解、配置化的方式定义
Http
请求 - 支持
Spring
和Springboot
集成 - 实现
JSON
和XML
的序列化和反序列化 - 支持JSON转换框架:
Fastjson
,Jackson
,Gson
- 支持
JAXB
形式的XML
转换 - 支持
SSL
的单向和双向加密 - 支持http连接池的设定
- 可以通过
OnSuccess
和OnError
接口参数实现请求结果的回调 - 配置简单,一般只需要
@Request
一个注解就能完成绝大多数请求的定义 - 支持异步请求调用
三、使用
1.安装
截至目前最新版本为1.5.2,只需在项目中导入下面依赖即可
<dependency> <groupId>com.dtflys.forest</groupId> <artifactId>forest-spring-boot-starter</artifactId> <version>1.5.2-BETA</version> </dependency>
2.进行Forest简单配置
forest支持okhttp3和httpclient,默认为okhttp
forest: bean-id: config0 # 在spring上下文中bean的id, 默认值为forestConfiguration backend: okhttp3 # 后端HTTP API: okhttp3 max-connections: 1000 # 连接池最大连接数,默认值为500 max-route-connections: 500 # 每个路由的最大连接数,默认值为500 timeout: 3000 # 请求超时时间,单位为毫秒, 默认值为3000 connect-timeout: 3000 # 连接超时时间,单位为毫秒, 默认值为2000 retry-count: 1 # 请求失败后重试次数,默认为0次不重试 ssl-protocol: SSLv3 # 单向验证的HTTPS的默认SSL协议,默认为SSLv3 logEnabled: true # 打开或关闭日志,默认为true log-request: true # 打开/关闭Forest请求日志(默认为 true) log-response-status: true # 打开/关闭Forest响应状态日志(默认为 true) log-response-content: true # 打开/关闭Forest响应内容日志(默认为 false)
3.接口调用
可以新建一个接口类来专门写第三方的接口调用,类似这样
请求方法支持GET、POST 、PUT 、HEAD OPTIONS、 DELETE
只需要在请求接口类上加上注解,这里以get请求方法为例
可以在接口上加注解@GetRequest("/xx") 或者 @Get("/xx") 或者@Request(type = "GET", url = "/xx") (这里type里get或GET不区分大小写)这三个注解的效果等同,注解只能在方法上
当请求的所以接口都有相同的属性或者在@Request里重复定义的内容时,可以在接口类上加上注解@BaseRequest,他配置的信息将会分配到每一个接口上,
这里申明的属性值优先级关系为 方法体上面注解@Request > 类申明注解@BaseRequest > application.yml
调用的时候只需要在sping中注入你写 的接口,像调用本地方法一样调用里面的接口方法
最后:
Forest
有很多其他的功能设定,可以类似RPC框架Feign,dubbo这些,只需要我们定义访问的接口,进行调用,而不用关注请求时的细节;同时实现了接口代码和业务代码的解耦,Forest和Feign在使用和配置上确实很相像,但Feign
的角色更多是作为Spring Cloud
生态里的一个成员。充当RPC通信的角色,其承担的不仅是http通讯,还要对注册中心下发的调用地址进行负载均衡。但是像请求第三方接口使用Forest绝对可以达到事半功倍的效果。