网络框架解析与应用

网络框架解析与应用

第一章

网络框架完全解析与应用

第二章 网络框架出现背景及优势

http出现及发展

  • 1960年由美国人Ted Nelson提出想法
  • 由万维网协会(WWW)和互联网工程工作共同研究
  • 目前使用最广泛的是HTTP1.1
  • 如图所示
http1.1.png

HTTP协议结构

  • 请求头
    • 表明本次请求的客户端
    • 本次请求所使用的cookie
    • 本次请求希望返回类型
    • 本次请求是否采用数据压缩等等一系列设置
    • 还可以自定义请求头
  • 请求体
    • 指定本次请求所使用的方法
    • 主要用来携带本次请求的参数
  • 响应头
    • 服务器标识
    • 状态码
    • 内容编码
    • cookie返回给客户端的cookie等等
  • 响应体
    • 主要就是我们的本次请求所返回的数据
  • 工作流程
    • 首先客户机与服务器需要建立连接
    • 建立连接后,客户机发送一个请求给服务器
    • 服务器接到请求后,给予相应的相应信息
    • 客户端接收服务器所返回的信息,连接断开
  • HTTP优势
    • 简单,快速
    • 灵活
    • 无连接
    • 无状态
  • SPDY介绍(google)
    • SPDY是一种HTTP的兼容协议

    • 多路复用请求

    • 对请求划分优先级

      可优先返回文字,多媒体内容后返回

    • 压缩HTTP头

  • HTTP2.0
    • 基于SPDY,IETF定制的新一代HTTP协议
    • 更安全的SSL
  • okhttp
  • okhttp优势
    • 支持SPDY,HTTP2.0,共享同一个Socket来处理同一个服务器的所有请求
    • 如果SPDY不可用,则通过连接池来减少请求延时
    • 无缝的支持GZIP来减少数据流量
    • 缓存响应数据来减少重复的网络请求
    • 可以从很多的常用链接问题中自动恢复
    • 使用起来非常简单

第三章 网络框架源码结构分析

网络框架源码结构

  • okhttp核心框架
    • 总体设计
      如图所示:


      http框架.png
    • 流程图
      如图所示:


      okhttp流程图.png
    • 核心类图
      如图所示:


      okhttp核心类图.jpg
    • 多路复用机制
      如图所示:


      okhttp多路复用.jpg
    • 重连机制
      如图所示:


      okhttp重连.jpg
  • okhttp核心类(粗体为核心流程)
    • Route
      路由类:用来分发请求
    • ResponseBody
      响应实体类:存放返回的数据,在byte()方法中是最原始的字节数据
    • Response
      构建者模式的响应类
      • Headers headers
        所有的响应头
      • ResponseBody body
        响应体
    • RequestBody
      请求类体类
      • FormBody
        请求头
      • MultipartBody
        文件上传等
    • Request
      构建者模式的请求类
    • Call(Interface)
      请求任务
      HttpEngine engine
    • RealCall(Runnable) Call的实现类
      真正执行响应处理
      Callback callback
    • HttpUrl
      Url的工具类
    • Headers
      请求头
    • Dns
      解析域名
    • ConnectionPool
      连接池
    • CallBack
      回调
    • Cache、ChchePoll
      缓存模块
    • HttpEngine
      真正发送请求的类
      • sendRequest 发送请求
      • recover重连
    • Dispatcher
      分发
      • executed(RealCall call)
    • HttpClient
      • Dispatcher dispatcher

网络框架简单使用

  • 简单实现get、post请求
    • // gradle引用

        compile 'com.squareup.okhttp3:okhttp:3.4.2'
      
    • activity_main.xml

            <?xml version="1.0" encoding="utf-8"?>
            <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                xmlns:tools="http://schemas.android.com/tools"
                android:id="@+id/activity_main"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingBottom="@dimen/activity_vertical_margin"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                tools:context="com.thssh.okhttpstudy.MainActivity">
            
                <ScrollView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">
            
                    <TextView
                        android:id="@+id/tv_content"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="Hello World!" />
                </ScrollView>
            
                <Button
                    android:id="@+id/btn_post"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true"
                    android:layout_alignParentRight="true"
                    android:clickable="true"
                    android:text="post" />
            
                <Button
                    android:id="@+id/btn_get"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_above="@+id/btn_post"
                    android:layout_alignParentRight="true"
                    android:layout_marginBottom="10dp"
                    android:clickable="true"
                    android:text="get" />
            
            </RelativeLayout>
      
    • MainActivity.java

            public class MainActivity extends AppCompatActivity {
            
                @Bind(R.id.btn_get)Button btnGet;
                @Bind(R.id.btn_post)Button btnPost;
                @Bind(R.id.tv_content)TextView tvContent;
            
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main);
                    ButterKnife.bind(this);
                }
            
                @OnClick(R.id.btn_get)
                public void getRequest(){
                    Request request = new Request.Builder()
                            .url("http://www.baidu.com").build();
                    OkHttpClient client = new OkHttpClient();
                    Call call = client.newCall(request);
                    call.enqueue(new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            setText(e.getMessage());
                        }
            
                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            setText(response.body().string());
                        }
                    });
                }
                @OnClick(R.id.btn_post)
                public void postRequest(){
                    OkHttpClient client = new OkHttpClient();
                    FormBody.Builder form = new FormBody.Builder();
                    form.add("userName", "hutianhang@docmail.cn");
                    form.add("password", "a123456");
                    form.add("clienttype", "mobile");
                    Request req = new Request.Builder()
                            .url("http://mail.docmail.cn/auth/login")
                            .post(form.build())
                            .build();
                    Call call = client.newCall(req);
                    call.enqueue(new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            setText(e.getMessage());
                        }
            
                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            setText(response.body().string());
                        }
                    });
                }
            
                private void setText(final String text){
                    tvContent.post(new Runnable() {
                        @Override
                        public void run() {
                            tvContent.setText(text);
                        }
                    });
                }
            }
      
    • 封装通用网络模块

      • 为什么要封装通用网络模块
        • 强大的可复用性
        • 与业务逻辑完全隔离
        • 强大的可扩展性
      • 封装思路
        • 封装一个公共的OkHttpClient
        • 封装一个通用的请求创建类CommonRequest
        • 封装一个通用的响应解析类JsonCommonRequest
        • 文件下载封装
      • 代码实战通用网络模块封装
      • 使用我们的网络模块

第四章 利用网络框架封装一个通用的网络请求模块

通用网络框架封装(详见源码)

第五章 使用封装好的网络模块

使用实例(详见源码)

第六章 总结

网络框架完全解析与应用

    - HTTP发展及okhttp优势
    - okhttp源码解析及基础用法
    - 基于okhttp封装通用网络模块

大家最爱的部分

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容