在《 Okhttp源码简单解析(一) 》这篇博客简单分析了Okhttp请求的执行流程,通过该篇博客我们知道OkHttp的核心网络请求中内置“拦截器”发挥了重大作用;本篇就对OkHttp内置拦截器链上第二个拦截器BridgeInterceptor的 作用进行简单的分析(第一个拦截器为RetryAndFollowUpInterceptor,因为本系列博客逻辑顺序关系,这个拦截器放后面讲解)。

Bridge,桥,什么桥?当然是链接客户端代码和网络代码的桥梁。正如官方对此类的注释所说:Bridges from application code to network code. First it builds a network request from a user request. Then it proceeds to call the network. Finally it builds a user response from the network response.
该拦截器是链接客户端代码和网络代码的桥梁,它首先将客户端构建的Request对象信息构建成真正的网络请求;然后发起网络请求,最后就是讲服务器返回的消息封装成一个Response对象。

所以BridgeInterceptor的作用大体体现如下(既然是拦截器当然是核心逻辑是intercept方法中):

 public Response intercept(Chain chain) throws IOException {//1.对Request进行处理Request newRequest = builderNetWorkRequestFromUserRequest();//2 调用后续的内置拦截器,返回服务器请求Response networkResponse = chain.proceed(requestBuilder.build());//对Response进行处理,并返回Response对象handleResponse();return networkResponse ;}

在进一步分析BridgeInterceptor之前,在说一点“课外”的知识,简单看一下一个正真的http请求都包含了什么:为此,我在浏览器地址栏里请求了我一片博客的地址,用FireBug查看其网络请求得到如图信息:

可以发现除了请求URL之外,浏览器还给你拼接了请求头信息,所以既然上面所说BridgeInterceptor的第一步是将用户请求创建真正的Network Request,那么这些头信息也是少不了的,看看该拦截器是怎么捯饬的:

    //获取用户构建的Request对象Request userRequest = chain.request();Request.Builder requestBuilder = userRequest.newBuilder();RequestBody body = userRequest.body();//设置Content-Typeif (body != null) {MediaType contentType = body.contentType();if (contentType != null) {requestBuilder.header("Content-Type", contentType.toString());}//Content-Length和Transfer-Encoding互斥long contentLength = body.contentLength();if (contentLength != -1) {requestBuilder.header("Content-Length", Long.toString(contentLength));requestBuilder.removeHeader("Transfer-Encoding");} else {requestBuilder.header("Transfer-Encoding", "chunked");requestBuilder.removeHeader("Content-Length");}}//设置Hostif (userRequest.header("Host") == null) {requestBuilder.header("Host", hostHeader(userRequest.url(), false));}//设置Connection头if (userRequest.header("Connection") == null) {requestBuilder.header("Connection", "Keep-Alive");}// If we add an "Accept-Encoding: gzip" header field we're responsible for also decompressing// the transfer stream.boolean transparentGzip = false;if (userRequest.header("Accept-Encoding") == null && userRequest.header("Range") == null) {transparentGzip = true;requestBuilder.header("Accept-Encoding", "gzip");}List<Cookie> cookies = cookieJar.loadForRequest(userRequest.url());if (!cookies.isEmpty()) {requestBuilder.header("Cookie", cookieHeader(cookies));}if (userRequest.header("User-Agent") == null) {requestBuilder.header("User-Agent", Version.userAgent());}

上面的代码逻辑也很简单,就是为Request设置User-Agent、Cookie、Accept-Encoding等相关请求头信息。到此为止一个完整的NetWork Request 就构建完毕,是时候发起真正的网络请求了。当然根据《Okhtt源码简单解析(一)》这篇所述,真正发起网络网络请求的就是连接器链上剩下拦截器的功能了:

//拦截器链继续往下运行
Response networkResponse = chain.proceed(requestBuilder.build());

当然就不是本篇要介绍的重点。根据拦截器的作用原理,此时剩下拦截器工作就是返回真正的网络响应了(当然此响应可能是缓存的,也可能是服务器返回的最新数据)。

//响应header, 如果没有自定义配置cookieJar==null,则什么都不做HttpHeaders.receiveHeaders(cookieJar, userRequest.url(), networkResponse.headers());Response.Builder responseBuilder = networkResponse.newBuilder().request(userRequest);//判断服务器是否支持gzip压缩格式,如果支持则交给kio压缩if (transparentGzip&& "gzip".equalsIgnoreCase(networkResponse.header("Content-Encoding"))&& HttpHeaders.hasBody(networkResponse)) {GzipSource responseBody = new GzipSource(networkResponse.body().source());Headers strippedHeaders = networkResponse.headers().newBuilder().removeAll("Content-Encoding").removeAll("Content-Length").build();responseBuilder.headers(strippedHeaders);responseBuilder.body(new RealResponseBody(strippedHeaders, Okio.buffer(responseBody)));}return responseBuilder.build();

到此为止本篇博客就完毕了,至于网络其他相关知识,会另开一片博客说明。本篇只是假的的对该拦截器的功能最粗略基本的说明,对 CookieJar或者gzip压缩功能的说明以及网络知识的相关说明另开篇写之,如有不当之处欢迎批评指正

Okhttp源码分析下一篇 Okhttp之CacheInterceptor简单分析

OkHttp之BridgeInterceptor简单分析相关推荐

  1. 你想要的系列:网络请求框架OkHttp3全解系列 - (二)OkHttp的工作流程分析

    Okhttp系列文章: 你想要的系列:网络请求框架OkHttp3全解系列 - (一)OkHttp的基本使用 你想要的系列:网络请求框架OkHttp3全解系列 - (二)OkHttp的工作流程分析 你想 ...

  2. R语言splines包构建基于logistic回归的自然样条分析:南非心脏病数据集、非线性:基函数展开和样条分析、你简单分析的不重要特征,可能只是线性不显著、而非线性是显著的

    R语言splines包构建基于logistic回归的自然样条分析:南非心脏病数据集.非线性:基函数展开和样条分析.你简单分析的不重要特征,可能只是线性不显著.而非线性是显著的 目录

  3. [EntLib]微软企业库5.0 学习之路——第七步、Cryptographer加密模块简单分析、自定义加密接口及使用—上篇...

    在完成了后,今天开始介绍企业库中的新模块:Cryptographer(加密模块),这个模块在日常的大多数项目的作用非常重要,例如:网站会员密码.身份证号.网站配置等,通过对信息进行加密可以保证项目数据 ...

  4. FFmpeg资料来源简单分析:libswscale的sws_getContext()

    ===================================================== FFmpeg库函数的源代码的分析文章: [骨架] FFmpeg源码结构图 - 解码 FFmp ...

  5. howdoi 简单分析

    对howdoi的一个简单分析. 曾经看到过下面的这样一段js代码: try{doSth(); } catch (e){ask_url = "https://stackoverflow.com ...

  6. Mac与Phy组成原理的简单分析

    Mac与Phy组成原理的简单分析 2011-12-28 15:30:43 //http://blog.chinaunix.net/uid-20528014-id-3050217.html 本文乃fir ...

  7. python做数据可视化的代码_Python数据可视化正态分布简单分析及实现代码

    Python说来简单也简单,但是也不简单,尤其是再跟高数结合起来的时候... 正态分布(Normaldistribution),也称"常态分布",又名高斯分布(Gaussiandi ...

  8. ASIHTTPRequest源码简单分析

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 ASIHttprequest 是基于CFNetwork的,由于CFNetwork是比较底层的http库,功能比较少, ...

  9. Hessian 源码简单分析

    Hessian 源码简单分析 Hessian 是一个rpc框架, 我们需要先写一个服务端, 然后在客户端远程的调用它即可. 服务端: 服务端通常和spring 做集成. 首先写一个接口: public ...

  10. python预测股票价格tushare_用tushare对股票进行简单分析

    用tushare对股票进行简单分析(仅供交流学习) import numpy as np import pandas as pd import matplotlib.pyplot as plt imp ...

最新文章

  1. JVM笔记 3 3 垃圾回收算法
  2. python动态生成数据库表 orm_Python自动化 【第十二篇】:Python进阶-MySQL和ORM
  3. oracle 月累计,oracle 可有什么方法 统计每月累积购买人数?
  4. msyql开启慢查询以及分析慢查询
  5. 服务器维护通宵,20150405晚上凌晨通宵进行服务器系统维护
  6. python 常用字符串 列表元祖字典都 自带的函数方法
  7. java redis 原子操作_7000字 Redis 超详细总结笔记 !建议收藏
  8. aws redshift_从本地安装的IDE访问AWS Redshift
  9. selenium 点击后没反应未报错_Selenium代码迁移时会出现哪些问题?(附解决方案)...
  10. 北京54坐标转WGS84坐标
  11. 系统辨识工具箱使用指南
  12. 【分享】微信H5游戏制作教程,用唤境引擎轻松开发微信AVG小游戏
  13. MATLAB | 全网唯一 ,MATLAB绘制阴影柱状图(填充斜线)
  14. 微观经济学之供给与需求--第一章第二章
  15. OpenCV 源码中分水岭算法 watershed 函数源码注解
  16. STM32 TIM高级定时器死区时间的计算
  17. 软件技术人员成长路线的设计
  18. 五险一金重要吗?还是趁年轻多赚钱比较重要?
  19. android立体3D效果_Android实现八大行星绕太阳3D旋转效果
  20. centos7.2安装dcos

热门文章

  1. Linux:进入文件夹提示Permission denied错误
  2. WOW、ScrollReveal:WOW.js和ScrollReveal.js基础学习
  3. linux内核zfs,ZFS与Linux文件系统的变革
  4. 微信公号“架构师之路”学习笔记(七)-互联网搜索架构设计
  5. 目标检测的性能上界讨论
  6. leetcode之逆波兰表达式
  7. 11-----的使用
  8. ng-model 数据不更新 及 ng-repeat【ngRepeat:dupes】错误
  9. 人工智能系统Google开源的TensorFlow官方文档中文版
  10. Win10技巧:如何确定电脑是否适用Hyper-V虚拟机?