okhttp-extension 是针对 okhttp 3 增强的网络框架。使用 Kotlin 特性编写,提供便捷的 DSL 方式创建网络请求,支持协程、响应式编程等等。
其 core 模块只依赖 OkHttp,不会引入第三方库。
okhttp-extension 可以整合 Retrofit、Feign 框架,还提供了很多常用的拦截器。 另外,okhttp-extension 也给开发者提供一种新的选择。
github地址:github.com/fengzhizi71…
Features:
- 支持 DSL 创建 HTTP
GET
/POST
/PUT
/HEAD
/DELETE
/PATCH
requests. - 支持 Kotlin 协程
- 支持响应式(RxJava、Spring Reactor)
- 支持函数式
- 支持熔断器(Resilience4j)
- 支持异步请求的取消
- 支持 Request、Response 的拦截器
- 提供常用的拦截器
- 支持自定义线程池
- 支持整合 Retrofit、Feign 框架
- 支持 Websocket 的实现、自动重连等
- core 模块只依赖 OkHttp,不依赖其他第三方库
一. General
1.1 Basic
无需任何配置(零配置)即可直接使用,仅限于 Get 请求。
1 | kotlin复制代码 "https://baidu.com".httpGet().use { |
或者需要依赖协程,也仅限于 Get 请求。
1 | kotlin复制代码 "https://baidu.com".asyncGet() |
1.2 Config
配置 OkHttp 相关的参数以及拦截器,例如:
1 | kotlin复制代码const val DEFAULT_CONN_TIMEOUT = 30 |
配置完之后,就可以直接使用 httpClient
1 | kotlin复制代码 httpClient.get{ |
这里的 url 需要和 baseUrl 组成完整的 url。比如:http://localhost:8080/response-headers-queries
当然,也可以使用 customUrl 替代 baseUrl + url 作为完整的 url
1.3 AOP
针对所有 request、response 做一些类似 AOP 的行为。
需要在构造 httpClient 时,调用 addRequestProcessor()、addResponseProcessor() 方法,例如:
1 | kotlin复制代码val httpClientWithAOP by lazy { |
这样在进行 request、response 时,会分别打印”request start”和”response start”。
因为在创建 request 之前,会处理所有的 RequestProcessor;在响应 response 之前,也会用内部的 ResponseProcessingInterceptor 拦截器来处理 ResponseProcessor。
RequestProcessor、ResponseProcessor 分别可以认为是 request、response 的拦截器。
1 | kotlin复制代码// a request interceptor |
我们可以多次调用 addRequestProcessor() 、addResponseProcessor() 方法。
二. DSL
DSL 是okhttp-extension
框架的特色。包含使用 DSL 创建各种 HTTP Request 和使用 DSL 结合声明式编程。
2.1 HTTP Request
使用 DSL 支持创建GET
/POST
/PUT
/HEAD
/DELETE
/PATCH
2.1.1 get
最基本的 get 用法
1 | kotlin复制代码 httpClient.get{ |
这里的 url 需要和 baseUrl 组成完整的 url。比如:http://localhost:8080/response-headers-queries
当然,也可以使用 customUrl 替代 baseUrl + url 作为完整的 url
2.1.2 post
基本的 post 请求如下:
1 | kotlin复制代码 httpClient.post{ |
支持 request body 为 json 字符串
1 | kotlin复制代码 httpClient.post{ |
支持单个/多个文件的上传
1 | kotlin复制代码 val file = File("/Users/tony/Downloads/xxx.png") |
更多 post 相关的方法,欢迎使用者自行探索。
2.1.3 put
1 | kotlin复制代码 httpClient.put{ |
2.1.4 delete
1 | kotlin复制代码 httpClient.delete{ |
2.1.5 head
1 | kotlin复制代码 httpClient.head{ |
2.1.6 patch
1 | kotlin复制代码 httpClient.patch{ |
2.2 Declarative
像使用 Retrofit、Feign 一样,在配置完 httpClient 之后,需要定义一个 ApiService 它用于声明所调用的全部接口。ApiService 所包含的方法也是基于 DSL 的。例如:
1 | kotlin复制代码class ApiService(client: HttpClient) : AbstractHttpService(client) { |
定义好 ApiService 就可以直接使用了,例如:
1 | kotlin复制代码val apiService by lazy { |
当然也支持异步,会返回CompletableFuture
对象,例如:
1 | kotlin复制代码val apiService by lazy { |
借助于 Kotlin 扩展函数
的特性,也支持返回 RxJava 的 Observable 对象等、Reactor 的 Flux/Mono 对象、Kotlin Coroutines 的 Flow 对象等等。
三. Interceptors
okhttp-extension
框架带有很多常用的拦截器
3.1 CurlLoggingInterceptor
将网络请求转换成 curl 命令的拦截器,便于后端同学调试排查问题。
以下面的代码为例:
1 | kotlin复制代码 httpClient.get{ |
添加了 CurlLoggingInterceptor 之后,打印结果如下:
1 | vbnet复制代码curl: |
CurlLoggingInterceptor 默认使用 println 函数打印,可以使用相应的日志框架进行替换。
3.2 SigningInterceptor
请求签名的拦截器,支持对 query 参数进行签名。
1 | kotlin复制代码const val TIME_STAMP = "timestamp" |
3.3 TraceIdInterceptor
需要实现TraceIdProvider
接口
1 | kotlin复制代码interface TraceIdProvider { |
TraceIdInterceptor 会将 traceId 放入 http header 中。
3.4 OAuth2Interceptor
需要实现OAuth2Provider
接口
1 | kotlin复制代码interface OAuth2Provider { |
OAuth2Interceptor 会将 token 放入 http header 中,如果 token 过期,会调用 refreshToken() 方法进行刷新 token。
3.5 JWTInterceptor
需要实现JWTProvider
接口
1 | kotlin复制代码interface JWTProvider { |
JWTInterceptor 会将 token 放入 http header 中,如果 token 过期,会调用 refreshToken() 方法进行刷新 token。
3.6 LoggingInterceptor
可以使用我开发的okhttp-logging-interceptor将 http request、response 的数据格式化的输出。
四. Coroutines
Coroutines 是 Kotlin 的特性,我们使用okhttp-extension
也可以很好地利用 Coroutines。
4.1 Coroutines
例如,最基本的使用
1 | kotlin复制代码 "https://baidu.com".asyncGet() |
亦或者
1 | kotlin复制代码 httpClient.asyncGet{ |
以及
1 | kotlin复制代码 httpClient.asyncPost{ |
asyncGet\asyncPost\asyncPut\asyncDelete\asyncHead\asyncPatch 函数在coroutines
模块中,都是 HttpClient 的扩展函数,会返回Deferred<Response>
对象。
同样,他们也是基于 DSL 的。
4.2 Flow
coroutines
模块也提供了 flowGet\flowPost\flowPut\flowDelete\flowHead\flowPatch 函数,也是 HttpClient 的扩展函数,会返回Flow<Response>
对象。
例如:
1 | kotlin复制代码 httpClient.flowGet{ |
或者
1 | kotlin复制代码 httpClient.flowPost{ |
五. WebSocket
OkHttp 本身支持 WebSocket ,因此okhttp-extension
对 WebSocket 做了一些增强,包括重连、连接状态的监听等。
5.1 Reconnect
在实际的应用场景中,WebSocket 的断线是经常发生的。例如:网络发生切换、服务器负载过高无法响应等都可能是 WebSocket 的断线的原因。
客户端一旦感知到长连接不可用,就应该发起重连。okhttp-extension
的 ReconnectWebSocketWrapper 类是基于 OkHttp 的 WebSocket 实现的包装类,具有自动重新连接的功能。
在使用该包装类时,可以传入自己实现的 WebSocketListener 来监听 WebSocket 各个状态以及对消息的接收,该类也支持对 WebSocket 连接状态变化的监听、支持设置重连的次数和间隔。
例如:
1 | kotlin复制代码 // 支持重试的 WebSocket 客户端 |
5.2 onConnectStatusChangeListener
ReconnectWebSocketWrapper 支持对 WebSocket 连接状态的监听,只要实现onConnectStatusChangeListener
即可。
1 | kotlin复制代码 ws?.onConnectStatusChangeListener = { |
未完待续。
另外,如果你对 Kotlin 比较感兴趣,欢迎去我的新书《Kotlin 进阶实战》去看看,刚刚在 10 月出版,书中融入了我多年使用 Kotlin 的实践思考与经验积累。
本文转载自: 掘金