zoukankan      html  css  js  c++  java
  • http框架--Forest 的使用

    引入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 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了,剩下的,就是本地代码形式的调用了。

    原文链接: https://mp.weixin.qq.com/s/MGgd9yqMm1SC0pd2M6szJA

  • 相关阅读:
    kafka 学习笔记
    awk命令详解
    apache 的 配置项
    Apache 的 httpd.conf 详解
    如何设置httpd-mpm-conf的参数
    apache 服务器概述--安装(一)
    centos 修改时区
    docker(三)docker镜像和镜像发布方法
    docker(二)部署docker容器虚拟化平台
    sql的存储过程使用详解--基本语法
  • 原文地址:https://www.cnblogs.com/yrjns/p/13519613.html
Copyright © 2011-2022 走看看