一款直击痛点的优秀http框架,让我超高效率完成了和第三方接口的对接
阅读本文大概需要 6 分钟。
来自:元人部落
1.背景
RESTFUL规范,有的基于传统的http规范;有的需要在header里放置签名,有的需要SSL的双向认证,有的只需要SSL的单向认证;有的以JSON 方式进行序列化,有的以XML方式进行序列化。类似于这样细节的差别太多了。apache的httpClient包,非常优秀的Okhttp,jersey client。http开源框架的接口使用相对来说,都不太一样。不管选哪个,在我这个场景里来说,我都不希望在调用每个第三方的http api时写上一堆http调用代码。https://gitee.com/dt_flys/forest 

2.上手
Forest支持了Springboot的自动装配,所以只需要引入一个依赖就行<dependency> 
<groupId>com.dtflys.forestgroupId>
<artifactId>spring-boot-starter-forestartifactId>
<version>1.3.0version>
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);
}
}
@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.特点
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 
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
);
@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的支持
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-storesforest: 
...
ssl-key-stores:
- id: pay-keystore
file: test.keystore
keystore-pass: 123456
cert-pass: 123456
protocols: SSLv3
5.最后
Forest有很多其他的功能设定,如果感兴趣的同学还请仔细去阅读文档和示例。Feign吗?Spring Cloud项目的时候,也用过一段时间Feign,个人感觉Forest的确在配置和用法上和Feign的设计很像,但Feign的角色更多是作为Spring Cloud生态里的一个成员。充当RPC通信的角色,其承担的不仅是http通讯,还要对注册中心下发的调用地址进行负载均衡。Forest这个开源项目其定位则是一个高阶的http工具,主打友好和易用性。从使用角度出发,个人感觉Forest配置性更加简单直接。提供的很多功能也能解决很多人的痛点。Forest推荐阅读:
高中生写LOL外挂1年狂赚500万,落网前刚买下120万保时捷...
微信扫描二维码,关注我的公众号
朕已阅 
评论

