当美团中问道:Android如何发起网络请求,你有用过相关框架码?OkHttp框架解决了你什么问题?

6,226 阅读6分钟

问题来源:某一网友美团面试中问题投稿,这里特意出一篇解析。

思考

首先我们思考下美团中问该问题的意义:主要考察面试者对网络体系的整体了解情况。问题中有提到OkHttp,第一是掌握面试者对OkHttp原理的了解,第二也是了解面试者是否有自己的思想,而不是人云亦云都在用OkHttp,所以我也用。

如何回答?

如何发起网络请求?

现在绝大多数的网络交互采用的是Http协议,也有同学使用过webSocket、ftp等协议。首先什么是协议,这些协议之间是什么关系,他们和TCP/IP又有什么关系?

image.png

平时我们所说的Http也好还是WebSocket也要,都是属于应用层协议。应用层负责的工作主要就是定义数据格式,制定通信双方采用何种数据格式通信。比如我们平时使用中文交流,就需要按照中文的语法组织语言,否则通信的另一方无法理解。

而应用层需要借助下层,传输层进行数据的传输,传输层需要传输数据同样需要使用下层的网络层完成寻址,确定要把数据传到哪个地址,传给谁。我们平时说的TCP协议就是传输层协议,而IP协议则是网络层协议。

写网络程序就必须用Socket,这是程序员都知道的,实际上socket就是对TCP/IP协议的封装。也就是说Http需要先利用Socket建立TCP/IP连接,然后就可以使用Socket读写数据,这个数据需要按照Http协议的规则、语义去封装与解析,这样就完成了Http的通信。如果按照WebSocket的规则定制数据,就是在完成WebSocket的通信。

OkHttp解决了你什么问题?

一般而言,我们都会借助一些框架来完成这个网络交互,OkHttp就是一个能够帮助我们完成网络通信的框架之一。借助OkHttp能否完成Http1.x、Http2.0以及WebSocket的通信。

连接池

首先OkHttp帮我们封装了Socket,提供更加简单的API让我们完成网络请求,同时OkHttp也根据协议规则,帮我们实现Socket的连接池,减少了请求延迟。

image.png

以Http协议为例,Http协议需要首先建立Socket连接(即TCP/IP连接),同时我们了解到TCP/IP连接需要进行三次握手,断开连接需要完成四次挥手。在完成了对某一域名的Socket连接之后,借助此Socket来进行Http数据的交互。那么第一次交互完成之后,如果需要进行与此域名的第二次交互,就可以利用前一次的Socket连接进行。因此OkHttp维护一个连接对象(Socket对象)复用池,在需要发起网络交互前,先尝试从对象池中查找是否有与本次请求的域名建立好的有效Socket连接,如果有,就不需要再去进行三次握手建立新的Socket连接。

Gzip压缩

第二,在进行数据传输时,我们都能够理解,传输的数据量越小,所需要花费的时间自然越短。因此OkHttp在发起请求时,默认会配置一个Http请求头:Accept-Encoding: gzip,此请求头告知服务器,可以将响应数据使用gzip压缩。

响应缓存

OkHttp也能够为我们自动根据协议规则缓存响应,在发起请求之前,OkHttp也会根据协议规则判断是否允许使用缓存,如果能够使用缓存,则可以不与服务器发起网络交互,直接将以前请求的缓存返回给使用者。但是需要主义的是,OkHttp缓存需要我们主动开启,同时只会对GET请求缓存。

其他

当然OkHttp还帮我们完成了以简单的配置完成对协议的处理,比如Cookie,DNS服务器,代理等等都只需要一个API就能完成对这些内容的配置与使用。

以上说明的都是OkHttp通用的介绍,其实我们为什么要用OkHttp?或者OkHttp帮我们解决了什么问题?没有太多的原因,就是单纯的okhttp提供的接口更友好,功能也齐全。另外多人开发一个项目的时候,因为每个人有自己的编码风格,单单一个网络访问,每个人都有不同的写法和封装。在一个项目中,这种代码必然是冗余的。而使用公开的框架,能够把大家的能力尽可能拉平到一条线上,避免一些基础错误。

同时还有些面试官可能会问:你觉得OkHttp有什么缺点

这个问题有些同学会回答:OkHttp不能把响应切回主线程;OkHttp的调用还是比较麻烦;嵌套请求不方便。其实在我看来,这些不应该说是OkHttp的缺点。

OkHttp是一个Java框架,并不是专用于Android。而且OkHttp的定位应该是一个网络基础功能库,它不需要考虑我们的业务场景是否需要嵌套调用,是否需要切换线程。如果考虑到业务我们应该在功能库的基础上自行完成封装,比如Retrofit就完成了对OkHttp的封装。

问题就解析到这里了,回答的可能不是那么完美,有什么不好或欠缺的地方,欢迎评论区一起讨论。

今日分享到此结束,对你有帮助的话,点个赞再走呗,每日一个面试小技巧

关注公众号:Android老皮
解锁  《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版

内容如下

1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔