<p align="center">
<a href="http://forest.dtflyx.com/">
<img width="300" src="site/media/logo3.png" alt="logo">
</a>
</p>
<p align="center">
<a href="https://gitee.com/dromara/forest">
<img src="https://gitee.com/dromara/forest/badge/star.svg" alt="Gitee Stars">
</a>
<!--
<a href="https://search.maven.org/artifact/com.dtflys.forest/forest-core/1.5.28/jar">
<img src="https://img.shields.io/badge/maven%20central-1.5.1-brightgreen.svg" alt="Maven Central">
</a>
-->
<!--
<a href="https://gitee.com/dromara/forest/releases/v1.5.28">
<img src="https://img.shields.io/badge/release-v1.5.28" alt="Release">
</a>
-->
<a href="https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html">
<img src="https://img.shields.io/badge/JDK-1.8+-yellow" alt="JDK">
</a>
<a href="https://codecov.io/gh/dromara/forest">
<img src="https://codecov.io/gh/dromara/forest/branch/master/graphs/badge.svg?branch=master" alt="Codecov">
</a>
<a href="https://opensource.org/licenses/mit-license.php">
<img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License">
</a>
<a href="http://forest.dtflyx.com/">
<img src="https://img.shields.io/badge/document-1.x-e96.svg" alt="Documentation">
</a>
<a href="https://gitee.com/dromara/forest#%E8%81%94%E7%B3%BB%E4%BD%9C%E8%80%85">
<img src="https://img.shields.io/badge/author-%E5%85%AC%E5%AD%90%E9%AA%8F-7af" alt="Author">
</a>
</p>
<h1 align="center">Forest - 声明式HTTP客户端框架</h1>
项目介绍:
-------------------------------------
Forest是一个高层的、极简的声明式HTTP调用API框架<br>
相比于直接使用Httpclient您不再用写一大堆重复的代码了,而是像调用本地方法一样去发送HTTP请求
荣获 **2021 年度 OSC 中国开源项目评选「最受欢迎项目」**
文档和示例:
-------------------------------------
* [项目主页](http://forest.dtflyx.com/)
* [中文文档](http://forest.dtflyx.com/docs/)
* [JavaDoc](https://apidoc.gitee.com/dt_flys/forest/)
* [Demo工程](https://gitee.com/dt_flys/forest-example)
Forest有哪些特性?
-----
* 以Httpclient和OkHttp为后端框架
* 通过调用本地方法的方式去发送Http请求, 实现了业务逻辑与Http协议之间的解耦
* 因为针对第三方接口,所以不需要依赖Spring Cloud和任何注册中心
* 支持所有请求方法:GET, HEAD, OPTIONS, TRACE, POST, DELETE, PUT, PATCH
* 支持文件上传和下载
* 支持灵活的模板表达式
* 支持拦截器处理请求的各个生命周期
* 支持自定义注解
* 支持OAuth2验证
* 支持过滤器来过滤传入的数据
* 基于注解、配置化的方式定义Http请求
* 支持Spring和Springboot集成
* JSON格式数据序列化和反序列化
* XML格式数据序列化和反序列化
* Protobuf格式数据序列化和反序列化
* JSON、XML或其他类型转换器可以随意扩展和替换
* 支持JSON转换框架: Fastjson, Jackson, Gson
* 支持JAXB形式的XML转换
* 可以通过OnSuccess和OnError接口参数实现请求结果的回调
* 配置简单,一般只需要@Request一个注解就能完成绝大多数请求的定义
* 支持异步请求调用
极速开始
-------------------------------------
以下例子基于Spring Boot
### 第一步:添加Maven依赖
直接添加以下maven依赖即可
```xml
<dependency>
<groupId>com.dtflys.forest</groupId>
<artifactId>forest-spring-boot-starter</artifactId>
<version>1.5.27</version>
</dependency>
```
### 第二步:创建一个`interface`
就以高德地图API为栗子吧
```java
package com.yoursite.client;
import com.dtflys.forest.annotation.Request;
import com.dtflys.forest.annotation.DataParam;
public interface AmapClient {
/**
* 聪明的你一定看出来了@Get注解代表该方法专做GET请求
* 在url中的{0}代表引用第一个参数,{1}引用第二个参数
*/
@Get("http://ditu.amap.com/service/regeo?longitude={0}&latitude={1}")
Map getLocation(String longitude, String latitude);
}
```
### 第三步:扫描接口
在Spring Boot的配置类或者启动类上加上`@ForestScan`注解,并在`basePackages`属性里填上远程接口的所在的包名
```java
@SpringBootApplication
@Configuration
@ForestScan(basePackages = "com.yoursite.client")
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
```
### 第四步:调用接口
OK,我们可以愉快地调用接口了
```java
// 注入接口实例
@Autowired
private AmapClient amapClient;
...
// 调用接口
Map result = amapClient.getLocation("121.475078", "31.223577");
System.out.println(result);
```
## 发送JSON数据
```java
/**
* 将对象参数解析为JSON字符串,并放在请求的Body进行传输
*/
@Post("/register")
String registerUser(@JSONBody MyUser user);
/**
* 将Map类型参数解析为JSON字符串,并放在请求的Body进行传输
*/
@Post("/test/json")
String postJsonMap(@JSONBody Map mapObj);
/**
* 直接传入一个JSON字符串,并放在请求的Body进行传输
*/
@Post("/test/json")
String postJsonText(@JSONBody String jsonText);
```
## 发送XML数据
```java
/**
* 将一个通过JAXB注解修饰过的类型对象解析为XML字符串
* 并放在请求的Body进行传输
*/
@Post("/message")
String sendXmlMessage(@XMLBody MyMessage message);
/**
* 直接传入一个XML字符串,并放在请求的Body进行传输
*/
@Post("/test/xml")
String postXmlBodyString(@XMLBody String xml);
```
## 发送Protobuf数据
```java
/**
* ProtobufProto.MyMessage 为 Protobuf 生成的数据类
* 将 Protobuf 生成的数据对象转换为 Protobuf 格式的字节流
* 并放在请求的Body进行传输
*
* 注: 需要引入 google protobuf 依赖
*/
@Post(url = "/message", contentType = "application/octet-stream")
String sendProtobufMessage(@ProtobufBody ProtobufProto.MyMessage message);
```
## 文件上传
```java
/**
* 用@DataFile注解修饰要上传的参数对象
* OnProgress参数为监听上传进度的回调函数
*/
@Post("/upload")
Map upload(@DataFile("file") String filePath, OnProgress onProgress);
```
可以用一个方法加Lambda同时解决文件上传和上传的进度监听
```java
Map result = myClient.upload("D:\\TestUpload\\xxx.jpg", progress -> {
System.out.println("progress: " + Math.round(progress.getRate() * 100) + "%"); // 已上传百分比
if (progress.isDone()) { // 是否上传完成
System.out.println("-------- Upload Completed! --------");
}
});
```
## 多文件批量上传
```java
/**
* 上传Map包装的文件列表,其中 {_key} 代表Map中每一次迭代中的键值
*/
@Post("/upload")
ForestRequest<Map> uploadByteArrayMap(@DataFile(value = "file", fileName = "{_key}") Map<String, byte[]> byteArrayMap);
/**
* 上传List包装的文件列表,其中 {_index} 代表每次迭代List的循环计数(从零开始计)
*/
@Post("/upload")
ForestRequest<Map> uploadByteArrayList(@DataFile(value = "file", fileName = "test-img-{_index}.jpg") List<byte[]> byteArrayList);
```
## 文件下载
下载文件也是同样的简单
```java
/**
* 在方法上加上@DownloadFile注解
* dir属性表示文件下载到哪个目录
* OnProgress参数为监听上传进度的回调函数
* {0}代表引用第一个参数
*/
@Get("http://localhost:8080/images/xxx.jpg")
@DownloadFile(dir = "{0}")
File downloadFile(String dir, OnProgress onProgress);
```
调用下载接口以及监听下载进度的代码如下:
```java
File file = myClient.downloadFile("D:\\TestDownload", progress -> {
System.out.println("progress: " + Math.round(progress.getRate() * 100) + "%"); // 已下载百分比
if (progress.isDone()) { // 是否下载完成
System.out.println("-------- Download Completed! --------");
}
});
```
## 基本签名验证
```java
@Post("/hello/user?username={username}")
@BasicAut
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
因为业务关系,要和许多不同第三方公司进行对接。这些服务商都提供基于http的api。但是每家公司提供api具体细节差别很大。有的基于RESTFUL规范,有的基于传统的http规范;有的需要在header里放置签名,有的需要SSL的双向认证,有的只需要SSL的单向认证;有的以JSON 方式进行序列化,有的以XML方式进行序列化。类似于这样细节的差别太多了。 不同的公司API规范不一样,这很正常。但是对于我来说,我如果想要代码变得优雅。我就必须解决一个痛点: 不同服务商API那么多的差异点,如何才能维护一套不涉及业务的公共http调用套件。最好通过配置或者简单的参数就能区分开来。进行方便的调用? 我当然知道有很多优秀的大名鼎鼎的http开源框架可以实现任何形式的http调用,在多年的开发经验中我都有使用过。比如apache的httpClient包,非常优秀的Okhttp,jersey client。 这些http开源框架的接口使用相对来说,都不太一样。不管选哪个,在我这个场景里来说,我都不希望在调用每个第三方的http api时写上一堆http调用代码。
资源推荐
资源详情
资源评论
收起资源包目录
Forest轻量级HTTP客户端框架.rar (755个子文件)
server_key.cer 847B
client_key.cer 847B
vue.css 12KB
spring.factories 119B
.gitignore 852B
.gitignore 9B
.gitignore 9B
spring.handlers 88B
index.html 1KB
ForestRequest.java 141KB
ProtobufProto.java 69KB
TestGenericForestClient.java 67KB
ForestMethod.java 66KB
TestPostClient.java 52KB
ForestConfiguration.java 52KB
TestUploadClient.java 51KB
TestGetClient.java 49KB
TestBaseRedirectClient.java 32KB
ForestResponse.java 20KB
MappingTemplate.java 20KB
PostClient.java 18KB
ForestURL.java 17KB
JsonTest.java 16KB
ReflectUtils.java 16KB
TestAsyncGetClient.java 16KB
ForestBeanRegister.java 15KB
ForestHeaderMap.java 14KB
MappingURLTemplate.java 14KB
ForestConfigurationBeanDefinitionParser.java 14KB
GetClient.java 14KB
OAuth2LifeCycle.java 13KB
OkHttp3Executor.java 12KB
ForestQueryMap.java 12KB
TestDownloadClient.java 12KB
ForestCookie.java 12KB
ForestConfigurationProperties.java 11KB
TestForestFastjsonConverter.java 11KB
TestExceptions.java 11KB
TestPoolClient.java 11KB
ForestFastjsonConverter.java 11KB
ForestBody.java 11KB
TestCookieClient.java 10KB
TestSSLClient.java 10KB
InterfaceProxyHandler.java 10KB
CookieTest.java 10KB
Interceptor.java 10KB
OkHttp3ConnectionManager.java 9KB
DefaultFormConvertor.java 9KB
MethodLifeCycleHandler.java 9KB
TestForestConfiguration.java 9KB
ForestGsonConverter.java 9KB
URLUtils.java 9KB
MockHttpServletRequest.java 9KB
DefaultLogHandler.java 8KB
ForestMultipartFactory.java 8KB
URLEncoder.java 8KB
OAuth2.java 8KB
TestHeadClient.java 8KB
HttpclientConnectionManager.java 8KB
TestForestProtobufConverter.java 8KB
OkHttp3BodyBuilder.java 8KB
MockServerRequest.java 8KB
TestEncoderClient.java 8KB
ClassPathClientScanner.java 8KB
MetaRequest.java 7KB
TestForestJacksonConverter.java 7KB
HttpclientBodyBuilder.java 7KB
ResultHandler.java 7KB
TestBodyAnnotation.java 7KB
TestRetryClient.java 7KB
DefaultAutoConverter.java 7KB
TestGsonConverter.java 7KB
ForestCookies.java 7KB
TestBackendClientProviderClient.java 7KB
ForestHeader.java 7KB
OkHttp3ForestResponse.java 6KB
TestBaseReqClient.java 6KB
SyncHttpclientRequestSender.java 6KB
Forest.java 6KB
ContentType.java 6KB
HttpclientForestResponse.java 6KB
BaseRequest.java 6KB
ForestJsonConverter.java 6KB
ForestAddress.java 6KB
SSLKeyStore.java 6KB
Request.java 6KB
HttpclientLogBodyMessage.java 6KB
AbstractBodyBuilder.java 6KB
Test0.java 6KB
OptionsRequest.java 6KB
DeleteRequest.java 6KB
Options.java 6KB
PatchRequest.java 6KB
TraceRequest.java 6KB
HeadRequest.java 6KB
PostRequest.java 6KB
Delete.java 6KB
Trace.java 6KB
GetRequest.java 6KB
Patch.java 6KB
共 755 条
- 1
- 2
- 3
- 4
- 5
- 6
- 8
资源评论
野生的大熊
- 粉丝: 230
- 资源: 247
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 历届(第1-21届)希望杯数学竞赛初一试题及答案(最新整理).doc全国数学邀请赛(264页资料)
- 水滴.psd
- TokenPocket_V2.1.2_release.apk
- Apache-druid-kafka-rce.yaml
- 基于C#的ASP.NET数据库原理及应用技术课程指导平台的开发
- 基于ROS的智能车轨迹跟踪算法的仿真与设计源码运用PID跟踪算法.zip.zip
- Bug Bounty Tip - i春秋Self-XSS变废为宝的奇思妙想
- 1991-2015年全国初中化学竞赛复赛试题汇编(212页)(24年竞赛复赛真题).docx天原杯
- Apache Flink 未授权访问+远程代码执行.pdf
- hadoop-基于hive的聊天数据分析报表可视化案例数据源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功