我愛說實話,Mica-Http 超好用!
作者:如夢技術
mica-http 是基于 okhttp 的封裝,提供了 Fluent 語法的 http 工具包。mica-http 的語法簡單易懂,同時還具有更好的性能和更高的安全性(自動關閉資源)。另外 mica-http 帶有 http 請求日志打印功能。
一、簡介
mica-http 是基于 okhttp 的封裝,提供了 Fluent 語法的 http 工具包。mica-http 的語法簡單易懂,同時還具有更好的性能和更高的安全性(自動關閉資源)。另外 mica-http 帶有 http 請求日志打印功能,
二、快速上手
1.1 導入依賴
<dependency>
<groupId>net.dreamlu</groupId>
<artifactId>mica-http</artifactId>
<version>2.7.18.1</version>
</dependency>
1.2 快速開始
String html = HttpRequest.get("https://www.baidu.com")
.useConsoleLog() // 日志,同類有useSlf4jLog()和useLog(log::info),日志級別默認為 BODY
.execute() // 執行,這里并非正在執行,這里只是轉換成了執行對象
.asString(); // 真正行并轉換結果
System.out.println(html);
1.3 異步請求
// 發送異步請求
HttpRequest.delete("https://www.baidu.com")
.async() // 開啟異步
.onFailed((request, e) -> { // 異常時的處理
e.printStackTrace();
})
.onResponse(responseSpec -> { // 消費響應, 注意:響應的流只能讀一次
int httpCode = responseSpec.code();
})
.onSuccessful(responseSpec -> { // 消費響應成功 http code in [200..300)
// 注意:響應結果流只能讀一次
JsonNode jsonNode = responseSpec.asJsonNode();
})
.execute(); // 異步最后發起請求
1.4 API說明
// 同步請求 url,方法支持 get、post、patch、put、delete
HttpRequest.get("https://www.baidu.com/{param1}/{param2}")
// 使用 Slf4j 日志
.useSlf4jLog()
// url 路徑參數處理
.pathParam("param1", "abc1")
.pathParam("param2", "abc2")
// 添加 header
.addHeader("x-account-id", "mica001")
// 添加 cookie
.addCookie(builder -> builder.domain("www.baidu.com").name("name").value("value"))
// 設置 url 請求參數,默認進行 url encode
.query("q", "mica")
.queryEncoded("name", "encodedValue")
// 對結果集進行斷言重試
.retryOn(responseSpec -> !responseSpec.isOk())
// 設置代理
.proxy(InetSocketAddress.createUnresolved("127.0.0.1", 8080))
// 表單構造器,同類 multipartFormBuilder 文件上傳表單構造器
.formBuilder()
// 表單參數
.add("id", 123123)
// 發起請求
.execute()
// 結果集轉換,注:如果網絡異常等會直接拋出異常,當然你還可以使用 onResponse、onSuccess 處理
.asJsonNode();
// 同類的方法有 asString、asBytes
// json 類響應:asJsonNode、asValue、asList、asMap、atJsonPath等,采用 jackson 處理
// file 文件:toFile
// 轉換成文件上傳的 Part:asPart 系列方法。
1.5 全局配置
全局日志配置:
// 設定全局日志級別 **NONE**(不打印日志)、 **BASIC**(只打印請求行和響應行)、 **HEADERS**(在BASIC的基礎上打印出請求頭)、 **BODY**(在BASIC的基礎上打印出請求和響應體)
HttpRequest.setGlobalLog(LogLevel.BODY);
// 設置控制臺日志,用于沒有日志依賴的 sdk 開發時使用
HttpRequest.setGlobalLog(HttpLogger.Console, LogLevel.BODY);
// 當然你也可以設定為自己的 log,這樣就不用把 **net.dreamlu.mica.http** 包的日志設置為 info 級別。
HttpRequest.setGlobalLog(log::info);
自定義 OkHttpClient
OkHttpClient httpClient = new OkHttpClient.Builder()
.build();
HttpRequest.setHttpClient(httpClient);
1.6 Cookie管理
默認內置了 InMemoryCookieManager,會自動保存和使用 cookie,另外可以自定義實現 okhttp 的 CookieJar。
InMemoryCookieManager cookieManager = new InMemoryCookieManager();
HttpRequest.get("http://fast.dreamlu.net/api/auth/captcha")
.cookieManager(cookieManager)
.execute()
.asString();
三、性能優異
http 壓測結果報告
第一輪
Benchmark Mode Cnt Score Error Units
MicaHttpBenchmark.micaHttp thrpt 5 899.299 ± 208.080 ops/min
MicaHttpBenchmark.okHttp thrpt 5 841.669 ± 106.094 ops/min
MicaHttpBenchmark.protoTypeOkHttp thrpt 5 346.647 ± 23.664 ops/min
第二輪
Benchmark Mode Cnt Score Error Units
MicaHttpBenchmark.micaHttp thrpt 5 876.651 ± 276.569 ops/min
MicaHttpBenchmark.okHttp thrpt 5 899.365 ± 194.188 ops/min
MicaHttpBenchmark.protoTypeOkHttp thrpt 5 341.028 ± 34.713 ops/min
第三輪
Benchmark Mode Cnt Score Error Units
MicaHttpBenchmark.micaHttp thrpt 5 944.017 ± 175.509 ops/min
MicaHttpBenchmark.okHttp thrpt 5 875.143 ± 164.594 ops/min
MicaHttpBenchmark.protoTypeOkHttp thrpt 5 331.370 ± 19.136 ops/min
解讀
- mica-http 對 okhttp 進行增強會復用OkHttpClient和連接池,并沒有明顯的性能損耗,偶爾結果還比 okhttp 表現得好。
- protoTypeOkHttp 采用的是每次 new OkHttpClient() 性能損耗明顯非常明顯,而且高并發下還有內存泄露,所以大家在使用時一定要注意。
四、安全
mica-http 在執行時會使用 try-with-resource語法自動關流,所以在使用時不用擔心流關閉問題。
責任編輯:武曉燕
來源:
JAVA架構日記