重试拦截器在交出(交给下一个拦截器)之前,负责判断用户是否取消了请求;在获得了结果之后 会根据响应码判断是否需要重定向,如果满足条件那么就会重启执行所有拦截器。
重试 重定向(最大次数为20)响应码 | 说明 | 重定向条件 |
---|---|---|
407 | 代理需要授权,如付费代理,需要验证身份 | 通过proxyAuthenticator获 得到了Request。 例: 添加 Proxy-Authorization 请求头 |
401 | 服务器需要授权,如某些接口需要登陆才能使用 (不安全,基本上没用了) | 通过authenticator获得到了Request。例: 添加 Authorization 请求头 |
3XX | 重定向响应 | OkHttpClient配置允许重定向 |
408 | 请求超时。 | 1、用户允许自动重试(默认允许) 2、本次请求的结果不是 响应408的重试结果 3、服务器未响应Retry-After(稍后重试),或者响应Retry-After: 0。 |
503 | 服务不可用 | 1、本次请求的结果不是 响应503的重试结果 2.服务器明确响应 Retry-After: 0,立即重试 |
421 | 从当前客户端所在的IP地址到服务器的连接数超过了服务器许可的最大范围 | 自动再次使用另一个连接对象发起请求 |
桥接拦截器在交出之前,负责将HTTP协议必备的请求头加入其中(如:Host)并添加一些默认的行为(如:GZIP压缩);在获得了结果后,调用保存cookie接口并解析GZIP数据。
补全请求头请求头 | 说明 |
---|---|
Content-Type | 请求体类型,如:application/x-www-form-urlencoded |
Content-Length/Transfer-Encoding | 请求体解析方式 |
Host | 请求的主机站点 |
Connection: Keep-Alive | 默认保持长连接 |
Accept-Encoding: gzip | 接收响应体使用gzip压缩 |
Cookie | Cookie身份识别 |
User-Agent | 用户信息,如: *** 作系统、浏览器等 |
1、读取Set-Cookie响应头并调用接口告知用户,在下次请求则会读取对应的数据设置进入请求头,默认CookieJar无实现;
2、响应头Content-Encoding为gzip,使用GzipSource包装解析。
CacheInterceptor缓存拦截器缓存拦截器顾名思义,交出之前读取并判断是否使用缓存;获得结果后判断是否缓存。
缓存规则Http的缓存我们可以按照行为将他们分为:强缓存和协商缓存
- 命中强缓存时,浏览器并不会将请求发送给服务器。强缓存是利用http的返回头中的Expires或者Cache-Control两个字段来控制的,用来表示资源的缓存时间;
- 若未命中强缓存,则浏览器会将请求发送至服务器。服务器根据http头信息中的Last-Modify/If-Modify- Since或Etag/If-None-Match来判断是否命中协商缓存。如果命中,则http返回码为304,客户端从缓存中加载资源。
拦截器通过CacheStrategy判断使用缓存或发起网络请求。此对象中的networkRequest与cacheResponse分别代表需要发起请求或者直接使用缓存
networkRequest | cacheResponse | 说明 |
---|---|---|
Null | Not Null | 直接使用缓存 |
Not Null | Null | 向服务器发起请求 |
Null | Null | 要求使用缓存,但是没有缓存。直接gg,okhttp直接返回504 |
Not Null | Not Null | 发起请求,若得到响应为304(无修改),则更新缓存响应并返回 |
即:networkRequest存在则优先发起网络请求,否则使用cacheResponse缓存,若都不存在则请求失败!
缓存检测 ConnectInterceptor连接拦截器连接拦截器在交出之前,负责找到或者新建 一个连接,并获得对应的socket流;在获得结果后 不进行额外的处理。
链接流程 连接池清理 代理链接 CallServerInterceptor请求服务器拦截器请求服务器拦截器进行真正的与服务器的通信,向服务器发送数据,解析读取的响应数据。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)