首页 > 编程语言 >Forest – 开源的 Java HTTP 客户端框架

Forest – 开源的 Java HTTP 客户端框架

时间:2023-02-05 10:11:14浏览次数:62  
标签:调用 Java 请求 接口 发送 Forest HTTP

什么是 Forest?

Forest 是一个开源的 Java HTTP 客户端框架,它能够将 HTTP 的所有请求信息(包括 URL、Header 以及 Body 等信息)绑定到您自定义的 Interface 方法上,能够通过调用本地接口方法的方式发送 HTTP 请求。

为什么使用 Forest?

使用 Forest 就像使用类似 Dubbo 那样的 RPC 框架一样,只需要定义接口,调用接口即可,不必关心具体发送 HTTP 请求的细节。同时将 HTTP 请求信息与业务代码解耦,方便您统一管理大量 HTTP 的 URL、Header 等信息。而请求的调用方完全不必在意 HTTP 的具体内容,即使该 HTTP 请求信息发生变更,大多数情况也不需要修改调用发送请求的代码。

Forest 如何使用?

Forest 不需要您编写具体的 HTTP 调用过程,只需要您定义一个接口,然后通过 Forest 注解将 HTTP 请求的信息添加到接口的方法上即可。请求发送方通过调用您定义的接口便能自动发送请求和接受请求的响应。

Forest 的工作原理

Forest 会将您定义好的接口通过动态代理的方式生成一个具体的实现类,然后组织、验证 HTTP 请求信息,绑定动态数据,转换数据形式,SSL 验证签名,调用后端 HTTP API(httpclient 等 API)执行实际请求,等待响应,失败重试,转换响应数据到 Java 类型等脏活累活都由这动态代理的实现类给包了。 请求发送方调用这个接口时,实际上就是在调用这个干脏活累活的实现类。

Forest 的架构

image

我们讲 HTTP 发送请求的过程分为前端部分和后端部分,Forest 本身是处理前端过程的框架,是对后端 HTTP API 框架的进一步封装。

前端部分:

  1. Forest 配置: 负责管理 HTTP 发送请求所需的配置。
  2. Forest 注解: 用于定义 HTTP 发送请求的所有相关信息,一般定义在interface上和其方法上。
  3. 动态代理: 用户定义好的 HTTP 请求的interface将通过动态代理产生实际执行发送请求过程的代理类。
  4. 模板表达式:
  5. 模板表达式可以嵌入在几乎所有的HTTP请求参数定义中,它能够将用户通过参数或全局变量传入的数据动态绑定到HTTP请求信息中。
  6. 数据转换: 此模块将字符串数据和JSON或XML形式数据进行互转。目前 JSON
  7. 转换器支持Jackson、Fastjson、Gson三种,XML 支持JAXB一种。
  8. 拦截器:
  9. 用户可以自定义拦截器,拦截指定的一个或一批请求的开始、成功返回数据、失败、完成等生命周期中的各个环节,以插入自定义的逻辑进行处理。
  10. 过滤器: 用于动态过滤和处理传入 HTTP 请求的相关数据。
  11. SSL: Forest 支持单向和双向验证的 HTTPS 请求,此模块用于处理 SSL 相关协议的内容。

后端部分:

后端为实际执行 HTTP 请求发送过程的第三方 HTTP API,目前支持okHttp3和httpclient两种后端 API。

所需环境

JDK 8+

名字由来

Forest就字面意思而言,就是森林的意思。但仔细看可以拆成For和Rest两个单词,也就是“为了Rest”(Rest为一种基于HTTP的架构风格)。 而合起来就是森林,森林由很多树木花草组成(可以理解为各种不同的服务),它们表面上看独立,实则在地下根茎交错纵横、相互连接依存,这样看就有点现代分布式服务化的味道了。 最后,这两个单词反过来读就像是Resultful。

官方文档

https://forest.dtflyx.com/

标签:调用,Java,请求,接口,发送,Forest,HTTP
From: https://www.cnblogs.com/Jim2023/p/17092917.html

相关文章

  • 如何用k8s运行、部署Java项目
    k8s的常用命令  kubectlgetingress-nprodkubectlgetdeployment-nprodkubectlgetpod-nprodkubectlgetservice-nprodkubectllogs-f-nprod......
  • 打包JavaScript的代码 (ES67891011 转为 ES5)
    NodeJS安装必要的工具包#初始化项目npminit-yes##安装babelbrowserify等包npmibabel-clibabel-preset-envbrowserify-D使用##babel转换指定文件夹下的代......
  • Java 实例 - int数组转化成List简便的方法
    如下:@Testpublicvoidtest5(){int[]array={1,2,5,5,5,5,6,6,7,2,9,2};/*int[]转list*///方法一:需要导入apacheco......
  • JavaScript学习笔记—DOM:通过属性读取样式
    读取的样式都是只读,无法修改获取元素内部的宽度和高度(包括内容区和内边距)element.clientHeightelement.clientWidth获取元素的可见框的大小(包括内容区、内边距和边框)......
  • 学习java第八天
    运算符   %=莫预算java等号是用两个等号==,不等于!=instanceof前四个必须掌握与或非重点掌握前四个ide快捷键ctrl+d复制本行到下一行package......
  • java中包(package)
    java中包(package)1、java中包的了解:在java中的包和我们文件系统层次结构是一一对应的。2、如果在java源文件中没定义package语句,那么该类就在默认包或者叫无名包中。3......
  • java学习day01—Markdown学习
    Markdown学习标题三级标题四级标题字体Hello,World!Hello,World!Hello,World!Hello,World!引用选择狂神说java,走向人生巅峰分割线图片超链接点击跳转到......
  • Java抽象类
    在java中用abstract关键字声明的类称为抽象类。它可以有抽象和非抽象方法(带主体的方法)。在学习java抽象类之前,先来了解java中的抽象。Java中的抽象抽象是隐藏实现细......
  • Java接口
    java中的接口是类的蓝图。它有静态常量和抽象方法。java中的接口是一种实现抽象的机制。接口中只有抽象方法而不是方法体。接口用于在Java中实现抽象和多重继承。Java......
  • java中使用xml基础
    XML概述XML的全称为(EXtensibleMarkupLanguage),是一种可扩展的标记语言标记语言:通过标签来描述数据的一门语言(标签有时我们也将其称之为元素)可扩展:标签的名字是......