首页 > 其他分享 >HTTP框架--FOREST 的使用

HTTP框架--FOREST 的使用

时间:2023-06-05 10:33:02浏览次数:56  
标签:http String -- Request json base FOREST HTTP public


引入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和返回。当然日志可以通过配置去控制开关。

HTTP框架--FOREST 的使用_java

Forest 底层封装了2种不同的http框架:Apache httpClientOKhttp。所以这个开源框架并没有对底层实现进行重复造轮子,而是在易用性上面下足了功夫。

我用Forest最终完成了和多个服务商api对接的项目,这些风格迥异的API,我仅用了1个小时时间就把他们转化为了本地方法。然后项目顺利上线。

Forest作为一款更加高层的http框架,其实你并不需要写很多代码,大多数时候,你仅通过一些配置就能完成http的本地化调用。而这个框架所能覆盖的面,却非常之广,满足你绝大多数的http调用请求。

Forest有以下特点:

  • HttpclientOkHttp为后端框架
  • 通过调用本地方法的方式去发送Http请求, 实现了业务逻辑与Http协议之间的解耦
  • 相比Feign更轻量,不依赖Spring Cloud和任何注册中心
  • 支持所有请求方法:GETHEADOPTIONSTRACEPOSTDELETEPUTPATCH
  • 支持灵活的模板表达式
  • 支持过滤器来过滤传入的数据
  • 基于注解、配置化的方式定义Http请求
  • 支持SpringSpringboot集成
  • 实现JSONXML的序列化和反序列化
  • 支持JSON转换框架: Fastjson,JacksonGson
  • 支持JAXB形式的XML转换
  • 支持SSL的单向和双向加密
  • 支持http连接池的设定
  • 可以通过OnSuccessOnError接口参数实现请求结果的回调
  • 配置简单,一般只需要@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

相关文章

  • SpringBoot中的定时任务的同步与异步
    SpringBoot中的定时任务的同步与异步你确定真的知道?授人以渔Java领域;架构知识;面试心得;互联网行业最新资讯定时任务调度功能在我们的开发中是非常常见的,随便举几个例子:定时清除一些过期的数据,定时发送邮件等等,实现定时任务调度的方式也十分多样,本篇文章主要学习各种实现定时任务......
  • Java中Double除保留后小数位的几种方法
     返回double型的1.能四舍五入doubled=114.145;d=(double)Math.round(d*100)/100;System.out.println(d); 2.BigDecimal.ROUND_HALF_UP表示四舍五入,BigDecimal.ROUND_HALF_DOWN也是五舍六入,BigDecimal.ROUND_UP表示进位处理(就是直接加1),BigDecimal.ROUND_DOWN表示直接......
  • Lattice-Based Group Signatures With Time-Bound Keys via Redactable Signatures
    ......
  • 外汇天眼:在风起云涌的外汇市场中,如何才能做好风险管理!
    在之前天眼君经常给大家分享了一些外汇投资交易的技巧,尤其是在交易前必须进行的风险管理。有些小伙伴对于具体的操作方式很好奇,特别是风险管理应该如何实施。实际上,这个风险管理牵涉到外汇的基本面分析,但是很多人并不清楚基本面分析究竟涵盖了哪些内容。对于外汇市场的分析方法,主要......
  • A572Gr50钢板简介、A572Gr50期货订轧、A572Gr50力学性能
    一、A572Gr50钢板简介: A572Gr50钢板是美国标准下的钢板牌号,属于是低合金高强度钢板的一种。目前钢板的强度要求比较高,但是对厚度还有要求,所以这些高强度钢板就应运而生。像是A572Gr50钢板就是在钢板内部添加少部分合金元素,使其通过特殊的热处理工艺之后,钢板的强度及韧性能得到部......
  • RabbitMQ配置文件及环境变量
    http://www.rabbitmq.com/configure.htmlMechanismDescriptionConfigurationFile(s)definesserverandpluginsettingsforTCPlistenersandothernetworking-relatedsettingsTLSresourceconstraints(alarms)authenticationandauthorizationbackendsmessagestore......
  • SpringBoot中的MapStruct使用
    目的:MapStruct可以实现对象之间的转换一、引入依赖<!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--mapstruct--><dependency><groupId>org.m......
  • 类GeometricShapeFactory-JTS几何图形绘制API
    org.locationtech.jts.util类GeometricShapeFactoryjava.lang.Objectorg.locationtech.jts.util.GeometricShapeFactory直接已知子类:正弦之星工厂公共类GeometricShapeFactory扩展Object计算各种常见的几何形状。提供各种方法来指定所生成形状的位置,范围和旋转,以及用于形成它们......
  • 从源码分析 Go 语言使用 cgo 导致的线程增长
    TDengineGo连接器https://github.com/taosdata/driver-go使用cgo调用taos.so中的API,使用过程中发现线程数不断增长,本文从一个cgo调用开始解析Go源码,分析造成线程增长的原因。转换cgo代码对driver-go/wrapper/taosc.go进行转换gotoolcgotaosc.go执行后生成......
  • fastAdmin 修改表单验证错误提示信息位置
    原先效果: 觉得在右侧不太好看,另外假如布局设置一行两块表单,那么会影响效果。解决方案找到\public\assets\js\require-form.js大概在15行左右//绑定表单事件form.validator($.extend({validClass:'has-success',invalidClass:'has-error',bindClassTo......