網(wǎng)絡框架解析與應用
第一章
網(wǎng)絡框架完全解析與應用
第二章 網(wǎng)絡框架出現(xiàn)背景及優(yōu)勢
http出現(xiàn)及發(fā)展
- 1960年由美國人Ted Nelson提出想法
- 由萬維網(wǎng)協(xié)會(WWW)和互聯(lián)網(wǎng)工程工作共同研究
- 目前使用最廣泛的是HTTP1.1
- 如圖所示

http1.1.png
HTTP協(xié)議結構
-
請求頭
- 表明本次請求的客戶端
- 本次請求所使用的cookie
- 本次請求希望返回類型
- 本次請求是否采用數(shù)據(jù)壓縮等等一系列設置
- 還可以自定義請求頭
-
請求體
- 指定本次請求所使用的方法
- 主要用來攜帶本次請求的參數(shù)
-
響應頭
- 服務器標識
- 狀態(tài)碼
- 內(nèi)容編碼
- cookie返回給客戶端的cookie等等
-
響應體
- 主要就是我們的本次請求所返回的數(shù)據(jù)
-
工作流程
- 首先客戶機與服務器需要建立連接
- 建立連接后,客戶機發(fā)送一個請求給服務器
- 服務器接到請求后,給予相應的相應信息
- 客戶端接收服務器所返回的信息,連接斷開
-
HTTP優(yōu)勢
- 簡單,快速
- 靈活
- 無連接
- 無狀態(tài)
-
SPDY介紹(google)
SPDY是一種HTTP的兼容協(xié)議
多路復用請求
-
對請求劃分優(yōu)先級
可優(yōu)先返回文字,多媒體內(nèi)容后返回
壓縮HTTP頭
-
HTTP2.0
- 基于SPDY,IETF定制的新一代HTTP協(xié)議
- 更安全的SSL
-
okhttp
- 為我們android客戶端支持HTTP2.0提供了途徑
- 由著名的square團隊開發(fā)
- 源碼位置https://github.com/square/okhttp
-
okhttp優(yōu)勢
- 支持SPDY,HTTP2.0,共享同一個Socket來處理同一個服務器的所有請求
- 如果SPDY不可用,則通過連接池來減少請求延時
- 無縫的支持GZIP來減少數(shù)據(jù)流量
- 緩存響應數(shù)據(jù)來減少重復的網(wǎng)絡請求
- 可以從很多的常用鏈接問題中自動恢復
- 使用起來非常簡單
第三章 網(wǎng)絡框架源碼結構分析
網(wǎng)絡框架源碼結構
-
okhttp核心框架
-
總體設計
如圖所示:
http框架.png -
流程圖
如圖所示:
okhttp流程圖.png -
核心類圖
如圖所示:
okhttp核心類圖.jpg -
多路復用機制
如圖所示:
okhttp多路復用.jpg -
重連機制
如圖所示:
okhttp重連.jpg
-
-
okhttp核心類(粗體為核心流程)
- Route
路由類:用來分發(fā)請求 - ResponseBody
響應實體類:存放返回的數(shù)據(jù),在byte()方法中是最原始的字節(jié)數(shù)據(jù) - Response
構建者模式的響應類- Headers headers
所有的響應頭 - ResponseBody body
響應體
- Headers headers
- RequestBody
請求類體類- FormBody
請求頭 - MultipartBody
文件上傳等
- FormBody
- Request
構建者模式的請求類 - Call(Interface)
請求任務
HttpEngine engine - RealCall(Runnable) Call的實現(xiàn)類
真正執(zhí)行響應處理
Callback callback - HttpUrl
Url的工具類 - Headers
請求頭 - Dns
解析域名 - ConnectionPool
連接池 -
CallBack
回調(diào) - Cache、ChchePoll
緩存模塊 -
HttpEngine
真正發(fā)送請求的類- sendRequest 發(fā)送請求
- recover重連
- Dispatcher
分發(fā)- executed(RealCall call)
-
HttpClient
- Dispatcher dispatcher
- Route
網(wǎng)絡框架簡單使用
- 簡單實現(xiàn)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); } }); } } -
封裝通用網(wǎng)絡模塊
- 為什么要封裝通用網(wǎng)絡模塊
- 強大的可復用性
- 與業(yè)務邏輯完全隔離
- 強大的可擴展性
- 封裝思路
- 封裝一個公共的OkHttpClient
- 封裝一個通用的請求創(chuàng)建類CommonRequest
- 封裝一個通用的響應解析類JsonCommonRequest
- 文件下載封裝
- 代碼實戰(zhàn)通用網(wǎng)絡模塊封裝
- 使用我們的網(wǎng)絡模塊
- 為什么要封裝通用網(wǎng)絡模塊
-
第四章 利用網(wǎng)絡框架封裝一個通用的網(wǎng)絡請求模塊
通用網(wǎng)絡框架封裝(詳見源碼)
第五章 使用封裝好的網(wǎng)絡模塊
使用實例(詳見源碼)
第六章 總結
網(wǎng)絡框架完全解析與應用
- HTTP發(fā)展及okhttp優(yōu)勢
- okhttp源碼解析及基礎用法
- 基于okhttp封裝通用網(wǎng)絡模塊




