【OKHHTP】干货走一波,走过路过不要错过

文章介绍了选择OKHTTP作为HTTP客户端的原因,如Google的认可和简洁的设计,并通过对比其他HTTP框架展示了OKHTTP的优势。作者详细阐述了如何封装OKHTTP的日志,包括拦截器和事件监听器的日志,以实现全链路监控。通过上下文传递,作者选择了通过HTTP请求携带上下文信息的方式来收集日志,最终展示了一段详细的日志输出示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用了OKHTTP之后,我也成为了其忠实的粉丝,本文核心要点,如何封装OKHTTP让其发挥最大的价值

主流HttpClient框架比较

  • 主要研究过JDK及OkHttp,以下对HttpComponents的评价可能不够客观。
  • google反对HttpComponents因设计复杂,而认可OkHttp且默认继承到android。
  • 大家都认可google,所以选OkHttp不会错。
FeatureJDK HttpClientApache HttpClientOkHttp
SupporterOracle社区(springboot集成了它))Android默认集成(被google认可)
诞生时间2018年2007年前2013年
活跃度☆☆☆☆☆☆☆☆☆
文档☆☆☆☆☆☆☆☆☆☆
Compress(gzip)☆☆☆☆☆☆☆☆☆☆☆
MultiPart
UrlBuilder
Intercept✔✔✔
Event✔✔✔
日志详细度☆☆☆☆☆
依赖外部02个共1300K4个共800K
maven引用数89K48K
GitHub Star1K主要没在这维护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&param3=param3&param1=param1&param2=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&param3=param3&param1=param1&param2=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&param3=param3&param1=param1&param2=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&param3=param3&param1=param1&param2=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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值