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