本文為菜鳥窩作者蔣志碧的連載碧聪≌晟“從 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é)議>://<主機>:<端口>/<路徑>
- 協(xié)議:采用的應(yīng)用層通信協(xié)議夸赫,比如在HTTP協(xié)議下的URL地址:
HTTP://<主機>:<端口>/<路徑> - 主機:請求資源所在主機的域名
- 端口和路徑有時可以省略(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