Java中輕量級http開發(fā)庫Unirest使用及實(shí)用技巧
Unirest for Java 是一個輕量級、易于使用的 HTTP 客戶端庫,旨在簡化 Java 應(yīng)用程序中的 HTTP 請求發(fā)送和響應(yīng)處理。它提供了簡潔的鏈?zhǔn)?API,支持同步和異步請求,并且能夠輕松處理 JSON 等常見數(shù)據(jù)格式。下面我會詳細(xì)介紹它的主要特性、基本用法以及一些實(shí)用技巧。
下面是一個表格,匯總了 Unirest for Java 的主要特性:
| 特性維度 | 說明 |
|---|---|
| 設(shè)計(jì)理念 | 提供簡單易用的鏈?zhǔn)?API,降低 HTTP 客戶端開發(fā)復(fù)雜度 |
| 依賴體積 | 輕量級,傳統(tǒng)依賴方式無需外部依賴;Standalone 方式包含所有依賴 |
| HTTP 方法 | 支持 GET、POST、PUT、DELETE 等 |
| 請求類型 | 支持同步和異步請求 |
| 數(shù)據(jù)格式支持 | 方便地處理 JSON(需選擇模塊,如 Gson 或 Jackson) |
| JSON 處理 | 從 4.x 版本開始,需顯式引入 Gson 或 Jackson 等 JSON 處理模塊 |
| 模塊化設(shè)計(jì) | 采用模塊化設(shè)計(jì),例如 JSON 處理可作為獨(dú)立模塊引入 |
?? 安裝與配置
在你的 Java 項(xiàng)目中使用 Unirest,通常只需要通過 Maven 或 Gradle 添加依賴。
Maven 依賴:
Unirest 提供了兩種主要的依賴引入方式:
- 傳統(tǒng)依賴:需要項(xiàng)目自身已包含必要的依賴項(xiàng)(如 Apache HTTP Client 和 JSON 處理庫)。
- Standalone 依賴:包含了所有必須的依賴,避免了潛在依賴沖突。
<!-- 方式一:傳統(tǒng)依賴 -->
<dependency>
<groupId>com.konghq</groupId>
<artifactId>unirest-java</artifactId>
<version>3.14.1</version> <!-- 請注意版本更新 -->
</dependency>
<!-- 方式二:Standalone 依賴(推薦避免依賴沖突) -->
<dependency>
<groupId>com.konghq</groupId>
<artifactId>unirest-java</artifactId>
<version>3.14.1</version>
<classifier>standalone</classifier>
</dependency>Gradle 依賴:
// 傳統(tǒng)依賴 implementation 'com.konghq:unirest-java:3.14.1' // 或者 Standalone 依賴 implementation 'com.konghq:unirest-java:3.14.1:standalone'
?? 關(guān)于 4.x 版本:
Unirest 的 4.x 版本采用了更模塊化的設(shè)計(jì)。例如,JSON 處理功能需要單獨(dú)引入特定模塊(如 unirest-modules-gson 或 unirest-modules-jackson),并推薦使用 BOM(Bill of Materials)來管理依賴版本。建議訪問 Unirest Java 官方文檔 或 GitHub 倉庫 了解最新版本信息和升級指南。
?? 核心用法
Unirest 的核心設(shè)計(jì)圍繞著簡潔的鏈?zhǔn)?API,讓你能夠流暢地構(gòu)建 HTTP 請求。
1. 發(fā)送 GET 請求
GET 請求通常用于從服務(wù)器獲取資源。Unirest 使得發(fā)送帶參數(shù)的 GET 請求非常方便。
import kong.unirest.HttpResponse;
import kong.unirest.JsonNode;
import kong.unirest.Unirest;
// 發(fā)送一個簡單的 GET 請求
HttpResponse<String> response = Unirest.get("http://httpbin.org/get")
.header("accept", "application/json") // 設(shè)置請求頭
.queryString("apiKey", "123") // 添加查詢參數(shù)
.asString(); // 指定期望的響應(yīng)體類型
System.out.println(response.getStatus()); // 獲取狀態(tài)碼
System.out.println(response.getBody()); // 獲取響應(yīng)體
// 查詢參數(shù)可以通過多種方式添加
// 逐個添加
Unirest.get("http://localhost")
.queryString("fruit", "apple")
.queryString("droid", "R2D2")
.asString();
// 請求結(jié)果為 http://localhost?fruit=apple&droid=R2D2
// 使用集合添加
Unirest.get("http://localhost")
.queryString("fruit", Arrays.asList("apple", "orange"))
.queryString(ImmutableMap.of("droid", "R2D2", "beatle", "Ringo"))
.asString();
// 請求結(jié)果為 http://localhost?fruit=apple&fruit=orange&droid=R2D2&beatle=Ringo2. 發(fā)送 POST 請求
POST 請求常用于向服務(wù)器提交數(shù)據(jù)。Unirest 支持多種方式提交數(shù)據(jù)。
// 提交表單數(shù)據(jù)
HttpResponse<String> response = Unirest.post("http://httpbin.org/post")
.header("accept", "application/json")
.field("param1", "value1") // 添加表單字段
.field("param2", "value2")
.asString();
// 提交 JSON 數(shù)據(jù)(需要相應(yīng)的 JSON 處理庫,如 Gson)
HttpResponse<JsonNode> jsonResponse = Unirest.post("http://localhost/post")
.header("accept", "application/json")
.header("Content-Type", "application/json")
.body("{\"name\": \"Gary\", \"age\": 30}") // 直接傳遞 JSON 字符串
// 或者傳遞一個可序列化的 Java 對象
// .body(new SomeUserObject("Gary"))
.asJson(); // 解析響應(yīng)為 JsonNode
// 提交原始字符串?dāng)?shù)據(jù)
Unirest.post("http://localhost")
.body("This is the entire body")
.asEmpty();3. 使用路徑參數(shù)和設(shè)置基礎(chǔ) URL
路徑參數(shù) (Route Parameters) 可以方便地動態(tài)設(shè)置 URL 中的部分:
// 使用占位符 {fruit},并通過 routeParam 設(shè)置其值
Unirest.get("http://localhost/{fruit}")
.routeParam("fruit", "apple") // 動態(tài)替換 {fruit} 為 apple
.asString();
// 請求結(jié)果為 http://localhost/apple
// 所有參數(shù)值都會自動進(jìn)行 URL 編碼
設(shè)置基礎(chǔ) URL (Default Base URL) 可以簡化重復(fù)的域名部分:
// 配置默認(rèn)基礎(chǔ) URL
Unirest.config().defaultBaseUrl("http://homestar.com");
// 后續(xù)請求只需指定路徑
Unirest.get("/runner").asString(); // 實(shí)際請求 http://homestar.com/runner
4. 設(shè)置請求頭與身份認(rèn)證
// 設(shè)置自定義請求頭
Unirest.get("http://localhost")
.header("Accept", "application/json")
.header("x-custom-header", "hello")
.asString();
// 基本身份認(rèn)證 (Basic Authentication)
Unirest.get("http://localhost")
.basicAuth("user", "password1!") // 自動進(jìn)行 Base64 編碼
.asString();
// 此調(diào)用會添加請求頭 "Authorization: Basic dXNlcjpwYXNzd29yZDEh"
// 請注意,涉及敏感信息時務(wù)必使用 HTTPS5. 處理響應(yīng)
.asXXX() 方法(如 asString, asJson)會阻塞當(dāng)前線程直到收到 HTTP 響應(yīng)。HttpResponse 對象包含了響應(yīng)的詳細(xì)信息:
HttpResponse<String> response = Unirest.get("http://httpbin.org/get").asString();
int status = response.getStatus(); // 獲取狀態(tài)碼,例如 200
String body = response.getBody(); // 獲取響應(yīng)體字符串
Headers headers = response.getHeaders(); // 獲取響應(yīng)頭信息
String contentType = response.getHeaders().getFirst("Content-Type"); // 獲取指定響應(yīng)頭6. 發(fā)送 PUT 和 DELETE 請求
// 發(fā)送 PUT 請求
HttpResponse<String> putResponse = Unirest.put("http://httpbin.org/put")
.header("accept", "application/json")
.field("param1", "value1")
.field("param2", "value2")
.asString();
// 發(fā)送 DELETE 請求
HttpResponse<String> deleteResponse = Unirest.delete("http://httpbin.org/delete")
.header("accept", "application/json")
.queryString("apiKey", "123")
.asString();?? 高級特性與配置
異步請求
Unirest 支持異步發(fā)送請求,這對于提高應(yīng)用程序的吞吐量和響應(yīng)性非常有用。
// 使用 Future 處理異步請求
Future<HttpResponse<JsonNode>> future = Unirest.post("http://localhost/post")
.header("accept", "application/json")
.field("param1", "value1")
.asJsonAsync(new Callback<JsonNode>() { // 指定回調(diào)函數(shù)
@Override
public void completed(HttpResponse<JsonNode> response) {
// 請求成功完成時調(diào)用
int code = response.getStatus();
JsonNode body = response.getBody();
Headers headers = response.getHeaders();
}
@Override
public void failed(UnirestException e) {
// 請求失敗時調(diào)用
System.out.println("The request has failed: " + e.getMessage());
}
@Override
public void cancelled() {
// 請求被取消時調(diào)用
System.out.println("The request has been cancelled");
}
});
// 在未來某個時刻,你可以使用 future.get() 獲取結(jié)果(這會阻塞)文件上傳
Unirest 簡化了文件上傳的過程。
// 分塊上傳大文件(示例框架,需完善)
try {
String filePath = "path/to/large/file.zip";
int chunkSize = 1024 * 1024; // 1MB 每塊
int totalChunks = (int) Math.ceil(new File(filePath).length() / (double) chunkSize);
for (int chunkNumber = 0; chunkNumber < totalChunks; chunkNumber++) {
byte[] chunkData = getChunkData(filePath, chunkNumber, chunkSize); // 需要實(shí)現(xiàn)讀取文件塊的方法
HttpResponse<String> chunkResponse = Unirest.post("http://example.com/upload")
.field("fileChunk", chunkData)
.field("chunkNumber", chunkNumber)
.field("totalChunks", totalChunks)
.asString();
// 處理每個分塊的上傳響應(yīng)
}
// 所有分塊上傳完成后,通知服務(wù)器合并
HttpResponse<String> mergeResponse = Unirest.post("http://example.com/merge")
.field("fileName", "file.zip")
.field("totalChunks", totalChunks)
.asString();
} catch (Exception e) {
e.printStackTrace();
}配置 Unirest
Unirest 提供了一些全局配置選項(xiàng),用于設(shè)置連接超時、重試策略等。
Unirest.config()
.connectTimeout(30000) // 設(shè)置連接超時為30秒
.enableCookieManagement(true) // 啟用 Cookie 管理
.verifySsl(false) // 是否驗(yàn)證 SSL 證書(生產(chǎn)環(huán)境應(yīng)設(shè)為 true)
.automaticRetries(true) // 啟用自動重試
.defaultBaseUrl("http://homestar.com"); // 設(shè)置默認(rèn)基礎(chǔ) URL
// 注意:在 JavaFX 或長時間運(yùn)行的應(yīng)用程序中,在程序退出時關(guān)閉 Unirest 實(shí)例是一個好習(xí)慣
// Unirest.shutdown();
?? 實(shí)踐建議
- 資源清理:如果你的應(yīng)用程序會長時間運(yùn)行或多次創(chuàng)建 Unirest 實(shí)例,在程序退出或不再需要時,調(diào)用
Unirest.shutdown()來釋放底層連接管理器資源,避免內(nèi)存泄漏。 - HTTPS 安全:在生產(chǎn)環(huán)境中,務(wù)必啟用 SSL 證書驗(yàn)證(
Unirest.config().verifySsl(true)),并使用 HTTPS 協(xié)議傳輸敏感信息。僅在開發(fā)測試時考慮禁用 SSL 驗(yàn)證。 - 異常處理:網(wǎng)絡(luò)請求充滿不確定性,務(wù)必使用
try-catch塊妥善處理UnirestException等異常,并根據(jù)需要檢查 HTTP 狀態(tài)碼。 - 依賴管理:
- 對于新項(xiàng)目,建議評估使用 4.x 版本,并根據(jù)需要引入 JSON 模塊。
- 使用
standalone分類器可以減少依賴沖突的可能性。 - 如果項(xiàng)目本身已管理了 HTTP 客戶端和 JSON 庫,則可使用傳統(tǒng)依賴方式。
- JSON 處理:在 3.x 版本中,Unirest 通常默認(rèn)集成 Gson。在 4.x 版本中,你需要明確選擇并引入
unirest-modules-gson或unirest-modules-jackson等模塊。
?? 總結(jié)
Unirest for Java 通過其鏈?zhǔn)?API 和合理的默認(rèn)配置,顯著降低了在 Java 應(yīng)用中處理 HTTP 請求的復(fù)雜度。無論是簡單的 REST API 調(diào)用還是復(fù)雜的文件上傳場景,它都能提供清晰、靈活的解決方案。
選擇 Unirest,意味著你在追求開發(fā)效率和應(yīng)用性能之間找到一個不錯的平衡點(diǎn)。當(dāng)然,對于極度追求性能或者需要精細(xì)控制 HTTP 行為的場景,你可能仍需考慮更底層的庫(如 Apache HttpClient 或 OkHttp)。但對于大多數(shù)日常開發(fā)任務(wù)而言,Unirest 無疑是一個“灰常”優(yōu)秀的工具。
到此這篇關(guān)于Java中輕量級http開發(fā)庫Unirest使用及實(shí)用技巧的文章就介紹到這了,更多相關(guān)java http開發(fā)庫unirest內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用ServletUtil.write方法下載接口文件中文亂碼問題解決
本文主要介紹了使用ServletUtil.write方法下載接口文件中文亂碼問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
Maven構(gòu)建SpringBoot集成MyBatis過程
文章介紹了如何使用Maven創(chuàng)建一個Spring Boot項(xiàng)目,并集成MyBatis,首先,配置Maven環(huán)境,然后在pom.xml中添加MyBatis依賴,配置數(shù)據(jù)庫連接信息,最后生成Mapper XML文件和DAO層代碼2024-11-11
Java 中的字符串替換方法之replace, replaceAll 和 rep
在Java中,字符串的替換是一種常見的操作,特別是在處理文本和格式化輸出時,本文將詳細(xì)討論這些方法的用法、區(qū)別以及示例,感興趣的朋友一起看看吧2024-12-12
springboot?vue接口測試HutoolUtil?TreeUtil處理樹形結(jié)構(gòu)
這篇文章主要介紹了springboot?vue接口測試HutoolUtil?TreeUtil處理樹形結(jié)構(gòu),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
java中g(shù)radle項(xiàng)目報錯org.gradle?.api.plugins.MavenPlugin解決辦法
在使用Gradle時開發(fā)者可能會遇到org.gradle?.api.plugins.MavenPlugin報錯提醒,這篇文章主要給大家介紹了關(guān)于java中g(shù)radle項(xiàng)目報錯org.gradle?.api.plugins.MavenPlugin的解決辦法,需要的朋友可以參考下2023-12-12
解決java文件流處理異常 mark/reset not supported問題
這篇文章主要介紹了解決java文件流處理異常 mark/reset not supported問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
SpringBoot注冊web組件的實(shí)現(xiàn)方式
Servlet是Java Web應(yīng)用程序的基礎(chǔ),它提供了處理客戶端請求的機(jī)制,Servlet三大組件是指Servlet、Filter和Listener,它們是Java Web應(yīng)用程序的核心組件,本文將給大家介紹一下SpringBoot注冊web組件的實(shí)現(xiàn)方式,需要的朋友可以參考下2023-10-10

