【從 0 開始開發(fā)一款直播 APP】4.1 網(wǎng)絡(luò)封裝之 Okhttp -- 基礎(chǔ)回顧

本文為菜鳥窩作者蔣志碧的連載碧聪≌晟“從 0 開始開發(fā)一款直播 APP ”系列來聊聊時下最火的直播 APP候醒,如何完整的實現(xiàn)一個類"騰訊直播"的商業(yè)化項目
視頻地址:http://www.cniao5.com/course/10121


【從 0 開始開發(fā)一款直播 APP】4.1 網(wǎng)絡(luò)封裝之 Okhttp -- 基礎(chǔ)回顧
【從 0 開始開發(fā)一款直播 APP】4.2 網(wǎng)絡(luò)封裝之 OkHttp -- GET假颇,POST歹啼,前后端交互
【從 0 開始開發(fā)一款直播 APP】4.3 網(wǎng)絡(luò)封裝之 OkHttp -- 封裝 GET蛾狗,POST FORM晋涣,POST JSON
【從 0 開始開發(fā)一款直播 APP】4.4 網(wǎng)絡(luò)封裝之 OkHttp -- 網(wǎng)絡(luò)請求實現(xiàn)直播登錄


一、前言

在講 OkHttp 封裝之前沉桌,我想整理下基礎(chǔ)知識谢鹊,一直對網(wǎng)絡(luò)編程沒有系統(tǒng)學(xué)習(xí)過算吩,借著這大好時機,想認真學(xué)習(xí)下 OkHttp 的請求與響應(yīng)佃扼,OkHttp 基本使用以及前后端交互偎巢,Okhttp 封裝等,一看就有好多要學(xué)啊兼耀,是的艘狭,真的很多,不過沒關(guān)系翠订,整理起來就對 Okhttp 有了更加系統(tǒng)的認識巢音,這是我想要的效果。

二尽超、Http 請求與響應(yīng)步驟

1.1 建立 TCP 連接

Http 在開始工作之前官撼,web 瀏覽器首先要通過網(wǎng)絡(luò)與 web 服務(wù)器建立連接,該連接是通過 TCP/Ip 協(xié)議 來完成的似谁,TCP 連接最熟悉的是三次握手傲绣,所謂三次握手,我的理解是:第一次客戶端向服務(wù)器發(fā)出連接服務(wù)器請求巩踏。第二次是服務(wù)端響應(yīng)客戶端請求并告知客戶端已接收到請求秃诵。第三次客戶端告知服務(wù)端接收到響應(yīng),可以進行數(shù)據(jù)可靠傳輸了塞琼。

1.2 web 瀏覽器向服務(wù)端發(fā)送請求命令

一旦建立 TCP 連接菠净,web 瀏覽器就會向服務(wù)器發(fā)送請求命令。

http://192.168.43.238:8080/okhttp/login?username=dali&password=123
協(xié)議    服務(wù)器地址          資源地址  請求參數(shù)

          GET       /okhttp   HTTP/1.1
    請求行(請求方式   資源地址   協(xié)議腳本)

1.3 web 瀏覽器發(fā)送請求頭信息

瀏覽器發(fā)送其請求命令之后彪杉,要以頭信息形式向web服務(wù)器發(fā)送用于描述瀏覽器的信息毅往,之后用一行空白行通知服務(wù)器,表示結(jié)束投信息的發(fā)送派近。若是 Post 請求攀唯,發(fā)送完請求頭信息之后還要發(fā)送請求體。

1.4 web 服務(wù)器應(yīng)答

客戶端向服務(wù)器發(fā)出請求后渴丸,服務(wù)器會向客戶端產(chǎn)生應(yīng)答侯嘀。

      HTTP/1.1  200    OK
響應(yīng)行(響應(yīng)協(xié)議  狀態(tài)碼  狀態(tài)信息)

1.5 web 服務(wù)器發(fā)送應(yīng)答頭信息

服務(wù)器響應(yīng)客戶發(fā)送的數(shù)據(jù)及其請求文檔,最后以一行空白行表示頭信息發(fā)送結(jié)束谱轨。

1.6 web 服務(wù)器向瀏覽器發(fā)送數(shù)據(jù)

web 服務(wù)器向瀏覽器發(fā)送頭信息后戒幔,它就以 Content-type 應(yīng)大頭信息所描述的格式發(fā)送用戶請求的實際數(shù)據(jù)。

1.7 web 服務(wù)器關(guān)閉 TCP 連接

一般情況下碟嘴,一旦 web 服務(wù)器向瀏覽器發(fā)送了請求數(shù)據(jù)溪食,它要關(guān)閉 TCP 連接,如果瀏覽器或服務(wù)器在頭信息加入Connection:keep-alive 這行代碼娜扇,TCP 連接在發(fā)送后仍要保持打開狀態(tài)错沃,瀏覽器可以繼續(xù)通過相同的連接發(fā)送請求,保持連接節(jié)省了為每個請求建立新連接所需的時間雀瓢, 還節(jié)約了網(wǎng)絡(luò)帶寬枢析。

二、OkHttp 類與 Http 請求響應(yīng)的映射

2.1刃麸、HTTP 請求

http請求由三部分組成醒叁,分別是:請求行(請求方法,請求地址泊业,協(xié)議版本)把沼、請求頭、請求體

2.1.1吁伺、請求行

用于聲明 ” 請求報文 “饮睬、主機域名、資源路徑和協(xié)議版本
請求方法

請求方法 說明
CET 請求獲取 Request-URI 所標(biāo)識的資源
POST 請求獲取 Request-URI 所標(biāo)識的資源
HEAD 請求獲取由 Request-URI 所標(biāo)識的資源的響應(yīng)消息報頭
PUT 請求服務(wù)器存儲一個資源篮奄,并用 Request-URI 作為其標(biāo)識
DELETE 請求服務(wù)器刪除 Request-URI 所標(biāo)識的資源
TRACE 請求服務(wù)器回送收到的請求信息捆愁,主要用于測試或診斷
CONNECT 保留將來使用
OPTIONS 請求查詢服務(wù)器的性能,或者查詢與資源相關(guān)的選項和需求

請求路徑
定義:Uniform Resoure Locator窟却,統(tǒng)一資源定位符昼丑,是一種自愿位置的抽象唯一識別方法。
作用:用于表示資源位置和訪問這些資源的方法
組成:

<協(xié)議>://<主機>:<端口>/<路徑>

  1. 協(xié)議:采用的應(yīng)用層通信協(xié)議夸赫,比如在HTTP協(xié)議下的URL地址:
    HTTP://<主機>:<端口>/<路徑>
  2. 主機:請求資源所在主機的域名
  3. 端口和路徑有時可以省略(HTTP默認端口號是80)

協(xié)議版本
HTTP協(xié)議版本主要是1.0菩帝、1.1、2.0

2.1.2茬腿、請求頭

作用:說明客戶端胁附、服務(wù)器或報文的部分信息
使用方式:采用” header(字段名):value(值)“的方式



舉個栗子(菜鳥窩官網(wǎng) Request Header)

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
Cache-Control:max-age=0
Connection:keep-alive

2.1.3、請求體

作用:用于存放需要發(fā)送給服務(wù)器的數(shù)據(jù)信息
使用方式:
1滓彰、數(shù)據(jù)交換格式
請求體可以是任意格式的控妻,服務(wù)器需要解析,如 JSON
2揭绑、鍵值對形式
鍵與值之間用 ” = “ 連接弓候,每個鍵值對間用 & 連接,且只能用ASCII字符他匪,如 Query String
3菇存、分部分形式
請求體被分為多個部分,應(yīng)用場景是文件上傳邦蜜,比如郵件上傳等等
每段以-- {boundary}開頭
然后是該段的描述頭
描述頭之后空一行接內(nèi)容
每段以-- {boundary}--結(jié)束

(請求體1) -- {boundary} (開頭)
        Content-Disposition:from-data;name="name"(描述頭)
        (空格)
        hello http (內(nèi)容)
(請求體2) -- {boundary} (開頭)
        Content-Disposition:from-data;name="name"(描述頭)
        (空格)
        hello http (內(nèi)容)     
(請求體結(jié)束標(biāo)志) --{boundary}--

2.2依鸥、HTTP 響應(yīng)

HTTP響應(yīng)也是由三個部分組成,分別是:狀態(tài)行(協(xié)議版本悼沈,狀態(tài)碼贱迟,狀態(tài)信息)姐扮、響應(yīng)頭、響應(yīng)正文

2.2.1衣吠、狀態(tài)行(空格不能什杳簟)


協(xié)議版本
HTTP協(xié)議版本主要是1.0、1.1缚俏、2.0
狀態(tài)碼
狀態(tài)碼分為 5 大類

| 狀態(tài)碼 | 描述 | 說明 |
| ---------- | --- |
| 200 | OK | 客戶端請求成功 |
| 400 | Bad Request | 由于客戶端請求有語法錯誤惊搏,不能被服務(wù)器所理解。 |
| 401 | Unauthonzed | 請求未經(jīng)授權(quán)忧换。這個狀態(tài)代碼必須和WWW-Authenticate報頭域一起使用 |
| 403 | Forbidden | 服務(wù)器收到請求恬惯,但是拒絕提供服務(wù)。服務(wù)器通常會在響應(yīng)正文中給出不提供服務(wù)的原因 |
| 404 | Not Found | 請求的資源不存在亚茬,例如酪耳,輸入了錯誤的URL。 |
| 500 | Internal Server Error | 服務(wù)器發(fā)生不可預(yù)期的錯誤才写,導(dǎo)致無法完成客戶端的請求葡兑。 |
| 503 | Service Unavailable | 服務(wù)器當(dāng)前不能夠處理客戶端的請求,在一段時間之后赞草,服務(wù)器可能會恢復(fù)正常讹堤。 |

狀態(tài)信息:對狀態(tài)碼進行描述

2.2.2、響應(yīng)頭

2.2.3厨疙、響應(yīng)體

作用:用于存放需要返回給客戶端的數(shù)據(jù)信息
使用方式:和請求體是一致的洲守,同樣分為:任意類型的數(shù)據(jù)交換格式、鍵值對形式和分部分形式沾凄,這里不作過多描述梗醇。

2.3、GET 請求和應(yīng)答

這里推薦一個抓包工具:
fiddler Fiddler應(yīng)用教程
charles Charles應(yīng)用教程
先構(gòu)建一個 GET 請求撒蟀,設(shè)置如下:



可以看到叙谨,GET 請求基本設(shè)置:請求方法,請求地址保屯,請求協(xié)議和請求頭手负。
接下來看請求響應(yīng):

2.4 POST 請求和應(yīng)答


請求方法為 post,請求地址是菜鳥窩登錄地址:http://www.cniao5.com/auth/login.html 姑尺。請求協(xié)議:HTTP/1.1竟终。
Http 請求類庫,應(yīng)該包含請求方法切蟋,請求地址统捶,請求協(xié)議,請求頭,請求體五部分喘鸟,查看OkHttp 的 Request 類

private final HttpUrl url;//請求地址
private final String method;//請求方法 GET POST
private final Headers headers;//請求頭
private final RequestBody body;//請求體
private final Object tag;//用于取消 Http 請求的標(biāo)志

Http Response
OkHttp 的 Response 類:

  private final Request request;//持有的請求
  private final Protocol protocol;//請求協(xié)議
  private final int code;//響應(yīng)狀態(tài)碼
  private final String message;//描述信息
  private final Handshake handshake;//SSL/TLS握手協(xié)議驗證時的信息
  private final Headers headers;//響應(yīng)頭
  private final ResponseBody body;//響應(yīng)體
  private Response networkResponse;
  private Response cacheResponse;
  private final Response priorResponse;

可以看到大體由應(yīng)答首行匆绣,應(yīng)答頭,應(yīng)答體構(gòu)成迷守。但是應(yīng)答首行表達的信息過多犬绒, HTTP/1.1 表示訪問協(xié)議旺入, 200 是響應(yīng)碼兑凿, OK 是描述狀態(tài)的消息。 根據(jù)單一職責(zé)茵瘾,我們不應(yīng)該把這么多內(nèi)容用一個應(yīng)答首行來表示礼华。這樣的話, 我們的響應(yīng)就應(yīng)該由訪問協(xié)議拗秘, 響應(yīng)碼圣絮, 描述信息,響應(yīng)頭雕旨,響應(yīng)體來組成扮匠。

三、總結(jié)

OkHttp 基礎(chǔ)知識暫時就講解這么多凡涩,基礎(chǔ)很重要棒搜,看了這些,小編也對網(wǎng)絡(luò)編程有了更多的認識活箕,希望你也能學(xué)到更多力麸。

更多內(nèi)容,請關(guān)注菜鳥窩(微信公眾號ID: cniao5)育韩,程序猿的在線學(xué)習(xí)平臺克蚂。 轉(zhuǎn)載請注明出處,本文出自菜鳥窩筋讨,原文鏈接http://www.cniao5.com/forum/thread/26159cc219e511e7a3c000163e0230fa

關(guān)注公眾號免費領(lǐng)取“N套客戶端實戰(zhàn)項目教程”
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末埃叭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子悉罕,更是在濱河造成了極大的恐慌赤屋,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛮粮,死亡現(xiàn)場離奇詭異益缎,居然都是意外死亡,警方通過查閱死者的電腦和手機然想,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門莺奔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事令哟∧涨恚” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵屏富,是天一觀的道長晴竞。 經(jīng)常有香客問我,道長狠半,這世上最難降的妖魔是什么噩死? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮神年,結(jié)果婚禮上已维,老公的妹妹穿的比我還像新娘。我一直安慰自己已日,他們只是感情好垛耳,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著飘千,像睡著了一般堂鲜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上护奈,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天缔莲,我揣著相機與錄音,去河邊找鬼逆济。 笑死酌予,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奖慌。 我是一名探鬼主播抛虫,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼简僧!你這毒婦竟也來了建椰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤岛马,失蹤者是張志新(化名)和其女友劉穎棉姐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啦逆,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡伞矩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了夏志。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乃坤。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出湿诊,到底是詐尸還是另有隱情狱杰,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布厅须,位于F島的核電站仿畸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏朗和。R本人自食惡果不足惜错沽,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望例隆。 院中可真熱鬧甥捺,春花似錦抢蚀、人聲如沸镀层。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽唱逢。三九已至,卻和暖如春屋休,著一層夾襖步出監(jiān)牢的瞬間坞古,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工劫樟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留痪枫,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓叠艳,卻偏偏與公主長得像奶陈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子附较,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容