一、简介
mica-http 是基于 okhttp 的封装,提供了 Fluent 语法的 http 工具包。mica-http 的语法简单易懂,同时还具有更好的性能和更高的安全性(自动关闭资源)。另外 mica-http 带有 http 请求日志打印功能,
二、快速上手
1.1 导入依赖
| |
| net.dreamlu |
| mica-http |
| 2.7.18.1 |
1.2 快速开始
| String html = HttpRequest.get("https://www.baidu.com") |
| .useConsoleLog() |
| .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 -> { |
| |
| JsonNode jsonNode = responseSpec.asJsonNode(); |
| }) |
| .execute(); |
1.4 API说明
| |
| HttpRequest.get("https://www.baidu.com/{param1}/{param2}") |
| |
| .useSlf4jLog() |
| |
| .pathParam("param1", "abc1") |
| .pathParam("param2", "abc2") |
| |
| .addHeader("x-account-id", "mica001") |
| |
| .addCookie(builder -> builder.domain("www.baidu.com").name("name").value("value")) |
| |
| .query("q", "mica") |
| .queryEncoded("name", "encodedValue") |
| |
| .retryOn(responseSpec -> !responseSpec.isOk()) |
| |
| .proxy(InetSocketAddress.createUnresolved("127.0.0.1", 8080)) |
| |
| .formBuilder() |
| |
| .add("id", 123123) |
| |
| .execute() |
| |
| .asJsonNode(); |
| |
| |
| |
| |
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语法自动关流,所以在使用时不用担心流关闭问题。