OKHttp3--详细使用及源码分析系列之初步介绍【一】

本文深入剖析OKHttp3框架,涵盖HTTP/SPDY/HTTP2.0协议介绍,OKHttp设计模式应用,以及实际使用流程指导。适用于希望深入了解网络请求处理机制的开发者。

系列

OKHttp3–详细使用及源码分析系列之初步介绍【一】
OKHttp3–流程分析 核心类介绍 同步异步请求源码分析【二】
OKHttp3–Dispatcher分发器源码解析【三】
OKHttp3–调用对象RealCall源码解析【四】
OKHttp3–拦截器链RealInterceptorChain源码解析【五】
OKHttp3–重试及重定向拦截器RetryAndFollowUpInterceptor源码解析【六】

网络协议

HTTP

在1960年一个美国人Ted Nelson提出了一种通过计算机处理文本信息的方法,称之为超文本(hypertext),这就是Http超文本传输协议标准架构的发展根基;接下来他组织WWW协会(World Wide Web Consortium)及IETF(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中最著名的就是定义了HTTP 1.1

HTTP:超文本传输协议(HyperText Transfer Protocol),用于从WWW服务器传输超文本到本地浏览器的一种协议,浏览器通过HTTP协议将WEB服务器上站点的网页代码提取下来渲染成漂亮的网页

客户端发送一个Http请求到服务器的请求消息格式:
请求行(request line),请求头部(header),空行和请求数据四个部分组成

客户端接收到服务器的响应格式:
状态行,消息报头,空行,响应正文

在早期的HTTP协议中,传输内容简单,基本上是一些静态页面和图片,无连接无状态是HTTP的优点,但是随着后面网络传输内容越来越复杂,这些反而成了它的缺点;于是后面又有了一种协议,它就是SPDY

SPDY

SPDY是HTTP的一种兼容协议,是谷歌为了解决HTTP的缺点,然后基于HTTP开发的一套协议,有一些新增的特点:

  • 支持多路复用
  • 对请求划分等级
  • 压缩请求头,减少网络传输数据量

HTTP2.0

HTTP2.0是IETF基于SPDY定制的新一代http协议,它比SPDY有更安全的SSL协议,采用了更安全的加密算法

既然http协议已经支持了HTTP2.0,那Android客户端怎么支持HTTP2.0呢?OKHttp提供了解决方案

OKHttp简介

说OHHttp是当下Android使用最频繁的网络请求框架应该是不过分的,是由Square公司贡献的一款开源工程;用于替代之前的HttpURLConnection(Google在Android4.4以后开始将源码中的HttpURLConnection替换成了OKHttp,但是HttpURLConnection的API还是在的,可以继续使用)和HttpClient(Google已经在Android6.0以后移除了HttpClient相关的API,已经不能继续使用);同时现在流行的Retrofit框架底层同样是使用OKHttp的,足以见证学习OKHttp框架的重要性

在早期的版本中,OkHttp支持Http1.0,Http1.1,SPDY协议,但是Http2协议的问世,导致OkHttp也做出了改变,OkHttp鼓励开发者使用HTTP2,不再对SPDY协议给予支持。另外,新版本的OkHttp还有一个新的亮点就是支持WebScoket,这样我们就可以非常方便的建立长连接了;OkHttp同样支持网络缓存,请求重试和重定向,支持HTTPS(TLS和SSL等加密协议)

官方学习途径

学习任何一个开源框架,大多数情况下看官方文档是没错的
官网网站:OkHttp,里面有详细的API介绍,及使用案例
项目托管:Github,有任何使用问题可以issue

OKHttp优点

  • 支持SPDY HTTP2.0;如果服务器和客户端都支持这两种 它会用同一个socket来处理同一个服务器的所有请求 提高http连接效率
  • 如果服务器不支持SPDY 则通过连接池来减少请求延时
  • 无缝的支持GZIP来减少数据流量
  • 缓存响应数据减少重复的网络请求
  • 请求失败时自动重试主机的其他ip,自动重定向
  • 多路复用机制

OKHttp使用到的设计模式

  • 单例模式:实例化OKHttpClient就要用到,因为每个OKHttpClient对象都有自己的连接池和线程池等资源,如果每次使用都去实例化一个新的对象,显然内存是吃不消的
  • 外观模式:OKHttpClient里面包含了很多类对象,其实就是将很多功能模块都封装到OKHttpClient中,由它单独对外提供API;这样就隐藏了系统的复杂性
  • 构建者模式:在实例化OKHttpClient和Request的时候,因为有太多的属性需要设置,而且开发者的需求组合千变万化,就需要通过Build一步一步构建需要的对象
  • 工厂方法模式:Call接口提供了内部接口Factory,用于将对象的创建延迟到该工厂类的子类中进行,从而实现动态的配置;该模式可以使得对象的创建不会对客户端暴露创建逻辑,通过使用一个共同的接口来指向新创建的对象
  • 享元模式:在Dispatcher的线程池中,所用到了享元模式,一个不限容量的线程池 , 线程空闲时存活时间为 60 秒。线程池实现了对象复用,降低线程创建开销,从设计模式上来讲,使用了享元模式。(享元模式:尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象,主要用于减少创建对象的数量,以减少内存占用和提高性能)
  • 责任链模式:很明显,在okhttp中的拦截器模块,执行过程用到。OkHttp3 的拦截器链中, 内置了5个默认的拦截器,分别用于重试、请求对象转换、缓存、链接、网络读写(责任链模式:为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推)
  • 策略模式:CacheInterceptor 实现了数据的选择策略, 来自网络还是来自本地? 这个场景也是比较契合策略模式场景, CacheInterceptor 需要一个策略提供者提供它一个策略, CacheInterceptor 根据这个策略去选择走网络数据还是本地缓存(策略模式:一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法)

使用流程

这里写图片描述

使用前准备

在build.gradle中添加依赖

compile 'com.squareup.okhttp3:okhttp:3.7.0'
compile 'com.squareup.okio:okio:1.12.0'

同时在Manifest里添加网络权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

如果需要缓存还要添加写内存的权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值