引入jar包
<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和返回。当然日志可以通过配置去控制开关。
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
一个注解就能完成绝大多数请求的定义 - 支持异步请求调用
详细文档: 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
的支持
以前用其他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了,剩下的,就是本地代码形式的调用了。
标签:http,String,--,Request,json,base,FOREST,HTTP,public From: https://blog.51cto.com/chengzheng183/6413485