网络请求的原理
网络请求在本质上可以理解为客户端发起请求(Request),然后服务器返回数据(Response)的过程。
也就是用户通过Socket发送数据给服务器,服务器通过对 Socket进行读写,然后对其进行解析,根据解析内容作出响应,然后客户端从自己的 socket缓冲区中读取信息。而我们所使用的 Httpclient, HttpurlconnectIon则是对其一个封装,将其中的流读写的细节进行了一个隐藏,再进一层Volley、Okhttp则是在其基础上结合线程池进行了一个更高效的封装,Retrofit则是在okhttp的基础之上,利用多种设计模式进行解耦的更简单易用,面向Restful的框架。但他们之间的层级关系并不是特别清晰,这要导致学习的时候有些混乱。
相比于HttpClient,HttpUrlConnection其API简单,体积小,而且其压缩和缓存机制可以有效的减少网络访问的流量,在提升速度和省电方面都很有优势,所以在Android 6.0中已经抛弃了HttpClient,因此现如今阶段,网络请求的一般是使用HttpURLConnection的
HttpURLConnection
Sun公司提供的库,基于HTTP协议的,其底层通过socket通信实现。主要实现了一下的功能
1.http状态码的定义,默认head定义,和ssl工厂,hostName审核器的判断定义
- 实现了GET或者POST方法
- 实现了链接超时的处理
- 实现了响应缓存 cache
- 实现了压缩技术 zip
Volley
是由Google公司推出的小巧轻便的异步请求库使网络通信更快、更简单、更健壮。适用于数据不大但通信频繁
优点:
- 适合数据量少的频繁网络数据交互情况
- 具有很好的封装,扩展性很强,支持 HttpClient、HttpUrlConnection,甚至支持 OkHttp
- 包的体积大约120k,物理质量小
- 可直接在主线程调用服务端并处理返回结果。
缺点
1.Volley不适合繁重的下载或者流的操作,因为Volley会把解析到的响应数据保持在内存中(ByteArrayPool形式)如果下载大量的数据,这个存储空间就会溢出。
- 不支持同步加载
- 只支持http请求。不支持https
Retrofit
Retrofit是Square公司(https://github.com/square?page=2)设计的默认基于okhttp封装,面向restful的网络请求框架,
优点
- 框架使用了很多设计模式,超级解耦、rest风格,更安全和高效
- 支持同步、异步
- 使用非常方便灵活。
- 可以配置不同的反序列化工具来解析数据,如json、xml等
缺点
- 执行的机制太严格
- 只能支持简单自定义参数类型
Okhttp
Okhttp概览优点
- 支持http请求,https请求、支持同步异步。
- 使用的是HttpURLConnectioQn,不要担心android版本的变换()
- 使用GZIP压缩下载内容,且压缩操作对用户是透明的
- 基于NIO和Okio,性能高
缺点
- callback回来是在线程里面, 不能刷新UI,需要我们手动处理。
- 封装比较麻烦。
相比于Volley,okhttp性能更高,因为 OkHttp 基于 NIO(非阻塞式io) 和 Okio(square公司开发的高效io库) ,所以性能上要比 Volley更快。
如果没有okhttp,会出现什么问题
- 如果开启了http缓存,在网络请求发出后,出现了io故障,导致没能接受到,隐私信息则可能泄露
详细见下篇博文
框架的选择
- Volley不支持同步加载,然而项目需要使用,不支持https,而项目需要使用
- Retrofit面向restful,然而本项目使用的GraphQL因此选择okhttp作为网络请求框架
网友评论