用了OKHTTP之后,我也成为了其忠实的粉丝,本文核心要点,如何封装OKHTTP让其发挥最大的价值
主流HttpClient框架比较
- 主要研究过JDK及OkHttp,以下对HttpComponents的评价可能不够客观。
- google反对HttpComponents因设计复杂,而认可OkHttp且默认继承到android。
- 大家都认可google,所以选OkHttp不会错。
Feature | JDK HttpClient | Apache HttpClient | OkHttp |
---|---|---|---|
Supporter | Oracle | 社区(springboot集成了它)) | Android默认集成(被google认可) |
诞生时间 | 2018年 | 2007年前 | 2013年 |
活跃度 | ☆ | ☆☆☆ | ☆☆☆☆☆☆ |
文档 | ☆☆ | ☆☆☆ | ☆☆☆☆☆ |
Compress(gzip) | ☆☆ | ☆☆☆☆ | ☆☆☆☆☆ |
MultiPart | ✘ | ✔ | ✔ |
UrlBuilder | ✘ | ✔ | ✔ |
Intercept | ✘ | ✔ | ✔✔✔ |
Event | ✘ | ✘ | ✔✔✔ |
日志详细度 | – | – | ☆☆☆☆☆ |
依赖外部 | 0 | 2个共1300K | 4个共800K |
maven引用数 | – | 89K | 48K |
GitHub Star | – | 1K主要没在这维护 | 35K |
可以看出OKHTTP还是很受欢迎呀,还是很活跃呀,有没有发现日志详细度,对于分析http调用的整个过程中,如果拥有上帝视角,是不是就能做到只要你生病,我都能快速治好
OKHTTP日志封装
这个日志封装主要包含下述两个日志
- 一个是拦截器日志,主要包含请求与响应的一些信息日志
- 事件监听器日志,包含了一个请求全链路的日志
封装日志的通用场景:如何将拦截器和事件监听器的日志收集再一起,且可以做到基于各种日志架构进行自定义封装?
日志要收集全,还要兼容各种日志架构,其实也不难,通过上下文传递信息不就可以收集到数据了,聊到上下文,实现上述场景的方案就有如下两个了
- 1:ThreadLocal线程副本(由于这里涉及到多线程及并发问题,可以使用TransmittableThreadLocal来实现)
- 2:通过http请求来传递上下文信息
这两个方案有优缺点,但是基于综合考虑,我选择了2,方案选好了就开始实现吧
实现思路
- 1.拦截器的日志封装
- 2.事件监听器的日志封装
- 3.封装需要收集的上下文信息,将拦截器日志信息和监听器信息收集到这个上下文实体中
- 4.打印打印打印打印日志
实现效果如下
2023-01-18 14:47:54,272 INFO [-nio-9964-exec-2]
14:47:54.226 【0ms】 callStart:Request{method=GET, url=http://localhost:9964/testHttpClient/testOk?time=1674024474207¶m3=param3¶m1=param1¶m2=param2, headers=[head1:head1, head2:head2, head3:head3], tags={class zzq.zzqsimpleframeworkhttp.config.HttpLogEntity=HttpLogEntity(startTime=0, log=, elapsedTime=0)}}
Sending request http://localhost:9964/testHttpClient/testOk?time=1674024474207¶m3=param3¶m1=param1¶m2=param2
head1: head1
head2: head2
head3: head3
14:47:54.237 【11ms】 proxySelectStart:http://localhost:9964/
14:47:54.238 【12ms】 proxySelectEnd:[DIRECT]
14:47:54.238 【12ms】 dnsStart:localhost
14:47:54.238 【12ms】 dnsEnd:[localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1]
14:47:54.243 【17ms】 connectStart:localhost/127.0.0.1:9964 DIRECT
14:47:54.247 【21ms】 connectEnd:http/1.1
14:47:54.248 【22ms】 connectionAcquired:Connection{localhost:9964, proxy=DIRECT hostAddress=localhost/127.0.0.1:9964 cipherSuite=none protocol=http/1.1}
14:47:54.250 【24ms】 requestHeadersStart
14:47:54.250 【24ms】 requestHeadersEnd
14:47:54.268 【42ms】 responseHeadersStart
14:47:54.269 【43ms】 responseHeadersEnd:Response{protocol=http/1.1, code=200, message=, url=http://localhost:9964/testHttpClient/testOk?time=1674024474207¶m3=param3¶m1=param1¶m2=param2}
14:47:54.271 【45ms】 responseBodyStart
14:47:54.271 【45ms】 responseBodyEnd:byteCount=9
Received response for http://localhost:9964/testHttpClient/testOk?time=1674024474207¶m3=param3¶m1=param1¶m2=param2 in 39ms
Content-Type: text/plain;charset=UTF-8
Content-Length: 9
Date: Wed, 18 Jan 2023 06:47:54 GMT
zzqtest42
14:47:54.271 【45ms】 connectionReleased
14:47:54.272 【46ms】 callEnd