一款超优秀的http框架,让我佩服得五体投地!
Posted 架构之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一款超优秀的http框架,让我佩服得五体投地!相关的知识,希望对你有一定的参考价值。
来源:cnblogs.com/bryan31/p/13359376.html
不同服务商API那么多的差异点,如何才能维护一套不涉及业务的公共http调用套件。最好通过配置或者简单的参数就能区分开来。进行方便的调用?
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));
}
3.特点
-
以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
);
以上三种写法是等价的
当然你也可以把参数绑定到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的支持
@Request(
url = "${base}/pay",
contentType = "application/json",
type = "post",
dataType = "json",
keyStore = "pay-keystore",
data = "${json($0)}"
)
public PayResponse pay(PayRequest request);
forest:
...
ssl-key-stores:
- id: pay-keystore
file: test.keystore
keystore-pass: 123456
cert-pass: 123456
protocols: SSLv3
5.最后
最近好文
以上是关于一款超优秀的http框架,让我佩服得五体投地!的主要内容,如果未能解决你的问题,请参考以下文章