Java輕量級(jí)類隔離框架 SOFAArk Project v2.3.0
42.5MB / 01-19
SpringBlade微服務(wù)開發(fā)平臺(tái) v4.4.0
197KB / 01-30
Diboot輕代碼開發(fā)平臺(tái) v2.11.0
1.3MB / 07-20
RuoYi-activiti工作流平臺(tái)源碼 v4.1
24.79MB / 07-19
RuoYi若依權(quán)限管理系統(tǒng) v4.7.9
4.12MB / 06-28
Java Struts2漏洞復(fù)現(xiàn)工具
98KB / 06-26
java操作excel的jar包(jxl.jar包 源碼)
610KB / 06-26
springboot整合QuartJob實(shí)現(xiàn)定時(shí)器實(shí)時(shí)管理源代碼
29KB / 06-26
SOFABoot開源框架 v3.25.0
587KB / 06-21
基于SSM的應(yīng)急資源管理系統(tǒng)源碼 v1.0
80.7MB / 05-25
-
Forest輕量級(jí)HTTP客戶端框架 v1.7.3 java源碼 / 2.35MB
-
Lucene全文檢索引擎工具包 v10.2.2 java源碼 / 43.5MB
-
螢火商城 v2.1.3 開源版 uniapp端 java源碼 / 529KB
-
Northstar盈富量化交易軟件 v7.3.6 java源碼 / 7.6MB
-
mica mqtt 組件 v2.4.9 java源碼 / 261KB
-
IoTLink輕量級(jí)物聯(lián)網(wǎng)綜合業(yè)務(wù)支撐平臺(tái) v2.2.2 java源碼 / 24.7MB
-
-
Hutool (Java基礎(chǔ)工具類) v5.8.39 java源碼 / 1.72MB
-
Hibernate數(shù)據(jù)持久層框架 v6.6.19 java源碼 / 13.1MB
-
Hibernate數(shù)據(jù)持久層框架 v7.0.4 java源碼 / 13.36MB
詳情介紹
Forest是一個(gè)高層的、極簡的輕量級(jí)HTTP調(diào)用API框架。相比于直接使用Httpclient您不再用寫一大堆重復(fù)的代碼了,而是像調(diào)用本地方法一樣去發(fā)送HTTP請求。
Forest有哪些特性?
以Httpclient和OkHttp為后端框架
通過調(diào)用本地方法的方式去發(fā)送Http請求, 實(shí)現(xiàn)了業(yè)務(wù)邏輯與Http協(xié)議之間的解耦
因?yàn)獒槍?duì)第三方接口,所以不需要依賴Spring Cloud和任何注冊中心
支持所有請求方法:GET, HEAD, OPTIONS, TRACE, POST, DELETE, PUT, PATCH
支持文件上傳和下載
支持靈活的模板表達(dá)式
支持?jǐn)r截器處理請求的各個(gè)生命周期
支持自定義注解
支持OAuth2驗(yàn)證
支持過濾器來過濾傳入的數(shù)據(jù)
基于注解、配置化的方式定義Http請求
支持Spring和Springboot集成
JSON字符串到Java對(duì)象的自動(dòng)化解析
XML文本到Java對(duì)象的自動(dòng)化解析
JSON、XML或其他類型轉(zhuǎn)換器可以隨意擴(kuò)展和替換
支持JSON轉(zhuǎn)換框架: Fastjson, Jackson, Gson
支持JAXB形式的XML轉(zhuǎn)換
可以通過OnSuccess和OnError接口參數(shù)實(shí)現(xiàn)請求結(jié)果的回調(diào)
配置簡單,一般只需要@Request一個(gè)注解就能完成絕大多數(shù)請求的定義
支持異步請求調(diào)用
極速開始
以下例子基于Spring Boot
第一步:添加Maven依賴
直接添加以下maven依賴即可
<dependency>
<groupId>com.dtflys.forest</groupId>
<artifactId>spring-boot-starter-forest</artifactId>
<version>1.5.0-BETA9</version>
</dependency>
第二步:創(chuàng)建一個(gè)interface
就以高德地圖API為栗子吧
package com.yoursite.client;
import com.dtflys.forest.annotation.Request;
import com.dtflys.forest.annotation.DataParam;
public interface AmapClient {
/**
* 聰明的你一定看出來了@Get注解代表該方法專做GET請求
* 在url中的${0}代表引用第一個(gè)參數(shù),${1}引用第二個(gè)參數(shù)
*/
@Get(url = "http://ditu.amap.com/service/regeo?longitude=${0}&latitude=${1}")
Map getLocation(String longitude, String latitude);
}
第三步:掃描接口
在Spring Boot的配置類或者啟動(dòng)類上加上@ForestScan注解,并在basePackages屬性里填上遠(yuǎn)程接口的所在的包名
@SpringBootApplication
@Configuration
@ForestScan(basePackages = "com.yoursite.client")
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
第四步:調(diào)用接口
OK,我們可以愉快地調(diào)用接口了
// 注入接口實(shí)例
@Autowired
private AmapClient amapClient;
...
// 調(diào)用接口
Map result = amapClient.getLocation("121.475078", "31.223577");
System.out.println(result);
發(fā)送JSON數(shù)據(jù)
/**
* 將對(duì)象參數(shù)解析為JSON字符串,并放在請求的Body進(jìn)行傳輸
*/
@Post(url = "/register")
String registerUser(@JSONBody MyUser user);
/**
* 將Map類型參數(shù)解析為JSON字符串,并放在請求的Body進(jìn)行傳輸
*/
@Post(url = "/test/json")
String postJsonMap(@JSONBody Map mapObj);
/**
* 直接傳入一個(gè)JSON字符串,并放在請求的Body進(jìn)行傳輸
*/
@Post(url = "/test/json")
String postJsonText(@JSONBody String jsonText);
發(fā)送XML數(shù)據(jù)
/**
* 將一個(gè)通過JAXB注解修飾過的類型對(duì)象解析為XML字符串
* 并放在請求的Body進(jìn)行傳輸
*/
@Post(url = "/message")
String sendXmlMessage(@XMLBody MyMessage message);
/**
* 直接傳入一個(gè)XML字符串,并放在請求的Body進(jìn)行傳輸
*/
@Post(url = "/test/xml")
String postXmlBodyString(@XMLBody String xml);
文件上傳
/**
* 用@DataFile注解修飾要上傳的參數(shù)對(duì)象
* OnProgress參數(shù)為監(jiān)聽上傳進(jìn)度的回調(diào)函數(shù)
*/
@Post(url = "/upload")
Map upload(@DataFile("file") String filePath, OnProgress onProgress);
可以用一個(gè)方法加Lambda同時(shí)解決文件上傳和上傳的進(jìn)度監(jiān)聽
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! --------");
}
});
多文件批量上傳
/**
* 上傳Map包裝的文件列表,其中 ${_key} 代表Map中每一次迭代中的鍵值
*/
@Post(url = "/upload")
ForestRequest<Map> uploadByteArrayMap(@DataFile(value = "file", fileName = "${_key}") Map<String, byte[]> byteArrayMap);
/**
* 上傳List包裝的文件列表,其中 ${_index} 代表每次迭代List的循環(huán)計(jì)數(shù)(從零開始計(jì))
*/
@Post(url = "/upload")
ForestRequest<Map> uploadByteArrayList(@DataFile(value = "file", fileName = "test-img-${_index}.jpg") List<byte[]> byteArrayList);
文件下載
下載文件也是同樣的簡單
/**
* 在方法上加上@DownloadFile注解
* dir屬性表示文件下載到哪個(gè)目錄
* OnProgress參數(shù)為監(jiān)聽上傳進(jìn)度的回調(diào)函數(shù)
* ${0}代表引用第一個(gè)參數(shù)
*/
@Get(url = "http://localhost:8080/images/xxx.jpg")
@DownloadFile(dir = "${0}")
File downloadFile(String dir, OnProgress onProgress);
調(diào)用下載接口以及監(jiān)聽下載進(jìn)度的代碼如下:
File file = myClient.downloadFile("D:\\TestDownload", progress -> {
System.out.println("progress: " + Math.round(progress.getRate() * 100) + "%"); // 已下載百分比
if (progress.isDone()) { // 是否下載完成
System.out.println("-------- Download Completed! --------");
}
});
基本簽名驗(yàn)證
@Post(url = "/hello/user?username=${username}")
@BasicAuth(username = "${username}", password = "bar")
String send(@DataVariable("username") String username);
OAuth 2.0
@OAuth2(
tokenUri = "/auth/oauth/token",
clientId = "password",
clientSecret = "xxxxx-yyyyy-zzzzz",
grantType = OAuth2.GrantType.PASSWORD,
scope = "any",
username = "root",
password = "xxxxxx"
)
@Get(url = "/test/data")
String getData();
自定義注解
Forest允許您根據(jù)需要自行定義注解,不但讓您可以簡單優(yōu)雅得解決各種需求,而且極大得擴(kuò)展了Forest的能力。
定義一個(gè)注解
/**
* 用Forest自定義注解實(shí)現(xiàn)一個(gè)自定義的簽名加密注解
* 凡用此接口修飾的方法或接口,其對(duì)應(yīng)的所有請求都會(huì)執(zhí)行自定義的簽名加密過程
* 而自定義的簽名加密過程,由這里的@MethodLifeCycle注解指定的生命周期類進(jìn)行處理
* 可以將此注解用在接口類和方法上
*/
@Documented
/** 重點(diǎn): @MethodLifeCycle注解指定該注解的生命周期類*/
@MethodLifeCycle(MyAuthLifeCycle.class)
@RequestAttributes
@Retention(RetentionPolicy.RUNTIME)
/** 指定該注解可用于類上或方法上 */
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface MyAuth {
/**
* 自定義注解的屬性:用戶名
* 所有自定注解的屬性可以在生命周期類中被獲取到
*/
String username();
/**
* 自定義注解的屬性:密碼
* 所有自定注解的屬性可以在生命周期類中被獲取到
*/
String password();
}
定義注解生命周期類
/**
* MyAuthLifeCycle 為自定義的 @MyAuth 注解的生命周期類
* 因?yàn)?@MyAuth 是針對(duì)每個(gè)請求方法的,所以它實(shí)現(xiàn)自 MethodAnnotationLifeCycle 接口
* MethodAnnotationLifeCycle 接口帶有泛型參數(shù)
* 第一個(gè)泛型參數(shù)是該生命周期類綁定的注解類型
* 第二個(gè)泛型參數(shù)為請求方法返回的數(shù)據(jù)類型,為了盡可能適應(yīng)多的不同方法的返回類型,這里使用 Object
*/
public class MyAuthLifeCycle implements MethodAnnotationLifeCycle<MyAuth, Object> {
/**
* 當(dāng)方法調(diào)用時(shí)調(diào)用此方法,此時(shí)還沒有執(zhí)行請求發(fā)送
* 次方法可以獲得請求對(duì)應(yīng)的方法調(diào)用信息,以及動(dòng)態(tài)傳入的方法調(diào)用參數(shù)列表
*/
@Override
public void onInvokeMethod(ForestRequest request, ForestMethod method, Object[] args) {
System.out.println("Invoke Method '" + method.getMethodName() + "' Arguments: " + args);
}
/**
* 發(fā)送請求前執(zhí)行此方法,同攔截器中的一樣
*/
@Override
public boolean beforeExecute(ForestRequest request) {
// 通過getAttribute方法獲取自定義注解中的屬性值
// getAttribute第一個(gè)參數(shù)為request對(duì)象,第二個(gè)參數(shù)為自定義注解中的屬性名
String username = (String) getAttribute(request, "username");
String password = (String) getAttribute(request, "password");
// 使用Base64進(jìn)行加密
String basic = "MyAuth " + Base64Utils.encode("{" + username + ":" + password + "}");
// 調(diào)用addHeader方法將加密結(jié)構(gòu)加到請求頭MyAuthorization中
request.addHeader("MyAuthorization", basic);
return true;
}
/**
* 此方法在請求方法初始化的時(shí)候被調(diào)用
*/
@Override
public void onMethodInitialized(ForestMethod method, BasicAuth annotation) {
System.out.println("Method '" + method.getMethodName() + "' Initialized, Arguments: " + args);
}
}
使用自定義的注解
/**
* 在請求接口上加上自定義的 @MyAuth 注解
* 注解的參數(shù)可以是字符串模板,通過方法調(diào)用的時(shí)候動(dòng)態(tài)傳入
* 也可以是寫死的字符串
*/
@Get(url = "/hello/user?username=${username}")
@MyAuth(username = "${username}", password = "bar")
String send(@DataVariable("username") String username);
Forest v1.6.4 版本發(fā)布了!
此次版本更新主要調(diào)整了 SSE 消息處理方面的接口
SSE 消息行模式
SSE 的消息通常為標(biāo)準(zhǔn)的多行一組的name:value格式,每組消息用空白行隔開,具體如下:
id:1 event:json data:{"name":"a"} text:xxx id:2 event:json data:{"name":"b"} text:yyy
對(duì)于這種標(biāo)準(zhǔn)的格式,可使用多行(MULTI_LINES),或自動(dòng)(AUTO)模式
Forest.get("/sse") .sse() .setOnMessage(event -> { event.id(); // 消息名為 id 的值,這里應(yīng)得到 1, 2 event.event(); // json event.data(); // {"name": "a"}, ... event.value("text"); // 獲取非標(biāo)準(zhǔn)名稱的消息值,如: text,這里應(yīng)得到 xxx, yyy }) .listen(SSELinesMode.MULTI_LINES);
或者使用AUTO,listen方法不傳參數(shù)的情況下,默認(rèn)為AUTO,AUTO模式會(huì)自動(dòng)識(shí)別需要采用的行模式
// AUTO 模式會(huì)自動(dòng)識(shí)別需要采用的行模式 sse.listen(); // 默認(rèn)行模式為 AUTO
SSE 的消息除了有標(biāo)準(zhǔn)格式,還有很多非標(biāo)準(zhǔn)的格式,比如每行都是一條JSON字符串,每一行都是單獨(dú)的消息
{"name":"a"} {"name":"b"} {"name":"c"}
對(duì)于這種類型的消息,就要使用單行模式(SINGLE_LINE)
Forest.get("/sse") .sse() .setOnMessage(event -> { String str = event.value(); // 獲取字符串類型的消息值 MyUser user = event.value(MyUser.class); // 獲取消息值并轉(zhuǎn)換為自定義類型 }) .listen(SSELinesMode.SINGLE_LINE);
修復(fù)錯(cuò)誤
feat: 新增 Forest 請求的 logRequestHeaders、logRequestBody 日志開關(guān)配置
fix: 重復(fù)讀取響應(yīng)流時(shí)報(bào)錯(cuò)
fix: 嵌套json字符串無法正常解析
下載地址
人氣源碼
若依后臺(tái)管理系統(tǒng) RuoYi v4.8.1
CryptoJS加密庫(crypto.js) v4.2.0
JetLinks開源物聯(lián)網(wǎng)平臺(tái)源碼 v2.2.0
Jeepay開源支付系統(tǒng) v2.4.0
JSH_ERP 開源版J2EE進(jìn)銷存系統(tǒng)代碼源碼 v1.0.2
ECharts JavaScript圖表庫 v5.6.0
QQ 聊天機(jī)器人小薇(XiaoV) v2.2.2
因酷時(shí)代(inxedu)在線教育系統(tǒng) V2.0.6
Javashop B2C開源電商系統(tǒng) v6.3.2
iBizEAM開源設(shè)備資產(chǎn)管理系統(tǒng)源碼 v1.0
相關(guān)文章
-
Java輕量級(jí)類隔離框架 SOFAArk Project v2.3.0
SOFAArk 是一款基于 Java 實(shí)現(xiàn)的動(dòng)態(tài)熱部署和輕量級(jí)類隔離框架,由螞蟻集團(tuán)開源貢獻(xiàn),主要提供應(yīng)用模塊的動(dòng)態(tài)熱部署和類隔離能力。歡迎需要的朋友下載使用...
-
SpringBlade微服務(wù)開發(fā)平臺(tái) v4.4.0
SpringBlade 是一個(gè)由商業(yè)級(jí)項(xiàng)目升級(jí)優(yōu)化而來的SpringCloud分布式微服務(wù)架構(gòu)、SpringBoot單體式微服務(wù)架構(gòu)并存的綜合型項(xiàng)目,采用Java8 API重構(gòu)了業(yè)務(wù)代碼,完全遵循阿里巴...
-
Diboot輕代碼開發(fā)平臺(tái) v2.11.0
Diboot輕代碼開發(fā)平臺(tái)是一個(gè)面向開發(fā)人員的低代碼開發(fā)平臺(tái),將重復(fù)性的工作自動(dòng)化,提高質(zhì)量、效率、可維護(hù)性...
-
RuoYi-activiti工作流平臺(tái)源碼 v4.1
RuoYi-activiti是一款以若依開源權(quán)限管理系統(tǒng)為基礎(chǔ)開發(fā)平臺(tái)并集成了activiti框架完成的工作流系統(tǒng),旨在打造集流程設(shè)計(jì)、流程部署、流程執(zhí)行、任務(wù)辦理、流程監(jiān)控于一體的...
-
RuoYi若依權(quán)限管理系統(tǒng) v4.7.9
RuoYi若依權(quán)限管理系統(tǒng)是一個(gè)基于SpringBoot的權(quán)限管理系統(tǒng),代碼易讀易懂、界面簡潔美觀, 核心技術(shù)采用Spring、MyBatis、Shiro沒有任何其它重度依賴,喜歡的朋友快來下載...
-
Java Struts2漏洞復(fù)現(xiàn)工具
今天給大家分享Java Struts2漏洞復(fù)現(xiàn)工具,喜歡的朋友快來下載體驗(yàn)吧...
-
java操作excel的jar包(jxl.jar包 源碼)
jxl.jar是通過java操作excel表格的工具類庫,能夠修飾單元格屬性,是由java語言開發(fā)而成的,接下來通過本文給大家介紹java操作excel的jar包(jxl.jar包 源碼),喜歡的朋友快...
-
springboot整合QuartJob實(shí)現(xiàn)定時(shí)器實(shí)時(shí)管理源代碼
Quartz是一個(gè)完全由java編寫的開源作業(yè)調(diào)度框架,形式簡易,功能強(qiáng)大,,下面給大家分享springboot整合QuartJob實(shí)現(xiàn)定時(shí)器實(shí)時(shí)管理源代碼,感興趣的朋友快來下載體驗(yàn)吧...
-
SOFABoot開源框架 v3.25.0
SOFABoot 是螞蟻集團(tuán)開源的基于 Spring Boot 的研發(fā)框架,它在 Spring Boot 的基礎(chǔ)上,提供了諸如 Readiness Check,上下文隔離,類隔離,日志空間隔離等等能力...
-
基于SSM的應(yīng)急資源管理系統(tǒng)源碼 v1.0
應(yīng)急資源管理系統(tǒng)用的是是比較流行的SSM和前端JSP技術(shù),用它來創(chuàng)建使用腳本語言,結(jié)合HTML代碼來制作動(dòng)態(tài) 網(wǎng)頁,歡迎需要的朋友下載使用...
下載聲明
☉ 解壓密碼:www.dbjr.com.cn 就是本站主域名,希望大家看清楚,[ 分享碼的獲取方法 ]可以參考這篇文章
☉ 推薦使用 [ 迅雷 ] 下載,使用 [ WinRAR v5 ] 以上版本解壓本站軟件。
☉ 如果這個(gè)軟件總是不能下載的請?jiān)谠u(píng)論中留言,我們會(huì)盡快修復(fù),謝謝!
☉ 下載本站資源,如果服務(wù)器暫不能下載請過一段時(shí)間重試!或者多試試幾個(gè)下載地址
☉ 如果遇到什么問題,請?jiān)u論留言,我們定會(huì)解決問題,謝謝大家支持!
☉ 本站提供的一些商業(yè)軟件是供學(xué)習(xí)研究之用,如用于商業(yè)用途,請購買正版。
☉ 本站提供的Forest輕量級(jí)HTTP客戶端框架 v1.7.3資源來源互聯(lián)網(wǎng),版權(quán)歸該下載資源的合法擁有者所有。