Android Http網(wǎng)絡(luò)開(kāi)發(fā)神兵利器
- Android Http網(wǎng)絡(luò)開(kāi)發(fā)神兵利器
- Http協(xié)議
- 網(wǎng)絡(luò)請(qǐng)求庫(kù)
- 工具
- OkHttp相關(guān)
- 其他
- 總結(jié)
- 參考資料
本人在A(yíng)ndroid移動(dòng)端開(kāi)發(fā)已經(jīng)有不少年的經(jīng)驗(yàn)轨奄,經(jīng)歷頗多和敬,感受頗深人乓,特寫(xiě)下此文記錄下在A(yíng)ndroid Http網(wǎng)絡(luò)開(kāi)發(fā)中的各種工具使用巢掺,如果有其他想法和建議,歡迎前來(lái)交流 xiaqiulei@126.com 佳鳖。 本人文筆較差兰粉,請(qǐng)不要見(jiàn)怪。
Android開(kāi)發(fā)的時(shí)候豫缨,很多APP都是基于網(wǎng)絡(luò)請(qǐng)求的,大部分應(yīng)用都是基于http的端朵,少部分是基于Socket的好芭,本文主要介紹Android Http開(kāi)發(fā)的主要實(shí)踐和工具。
本文最先發(fā)表于Github冲呢,如有轉(zhuǎn)載舍败,請(qǐng)注明轉(zhuǎn)載出處。
Http協(xié)議
說(shuō)起Http網(wǎng)絡(luò)請(qǐng)求敬拓,那么要介紹下Http協(xié)議邻薯,我在公司面試的時(shí)候也很喜歡問(wèn)這個(gè)問(wèn)題春感。很多做好了3-5年的工程師眶痰,竟然不知道Http協(xié)議,只知道怎么調(diào)用類(lèi)庫(kù)削解,不知道原理营勤。
作為一個(gè)有追求的程序員灵嫌,Http協(xié)議還是需要了解的。知其然知其所以然冀偶,在了解Http協(xié)議的情況下醒第,才能在實(shí)際開(kāi)發(fā)中靈活運(yùn)用和優(yōu)化。
這里有篇 文章 进鸠,Http協(xié)議介紹的很詳細(xì)稠曼。
HTTP簡(jiǎn)介
HTTP協(xié)議是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫(xiě),是用于從萬(wàn)維網(wǎng)(WWW:World Wide Web )服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議。
HTTP是一個(gè)基于TCP/IP通信協(xié)議來(lái)傳遞數(shù)據(jù)(HTML 文件, 圖片文件, 查詢(xún)結(jié)果等)客年。
HTTP是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議霞幅,由于其簡(jiǎn)捷、快速的方式量瓜,適用于分布式超媒體信息系統(tǒng)司恳。它于1990年提出,經(jīng)過(guò)幾年的使用與發(fā)展绍傲,得到不斷地完善和擴(kuò)展扔傅。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規(guī)范化工作正在進(jìn)行之中烫饼,而且HTTP-NG(Next Generation of HTTP)的建議已經(jīng)提出猎塞。
HTTP協(xié)議工作于客戶(hù)端-服務(wù)端架構(gòu)為上。瀏覽器作為HTTP客戶(hù)端通過(guò)URL向HTTP服務(wù)端即WEB服務(wù)器發(fā)送所有請(qǐng)求杠纵。Web服務(wù)器根據(jù)接收到的請(qǐng)求后荠耽,向客戶(hù)端發(fā)送響應(yīng)信息。
主要特點(diǎn)
1比藻、簡(jiǎn)單快速:客戶(hù)向服務(wù)器請(qǐng)求服務(wù)時(shí)铝量,只需傳送請(qǐng)求方法和路徑倘屹。請(qǐng)求方法常用的有GET、HEAD慢叨、POST纽匙。每種方法規(guī)定了客戶(hù)與服務(wù)器聯(lián)系的類(lèi)型不同。由于HTTP協(xié)議簡(jiǎn)單插爹,使得HTTP服務(wù)器的程序規(guī)模小哄辣,因而通信速度很快。
2赠尾、靈活:HTTP允許傳輸任意類(lèi)型的數(shù)據(jù)對(duì)象力穗。正在傳輸?shù)念?lèi)型由Content-Type加以標(biāo)記。
3.無(wú)連接:無(wú)連接的含義是限制每次連接只處理一個(gè)請(qǐng)求气嫁。服務(wù)器處理完客戶(hù)的請(qǐng)求当窗,并收到客戶(hù)的應(yīng)答后,即斷開(kāi)連接寸宵。采用這種方式可以節(jié)省傳輸時(shí)間崖面。
4.無(wú)狀態(tài):HTTP協(xié)議是無(wú)狀態(tài)協(xié)議。無(wú)狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒(méi)有記憶能力梯影。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息巫员,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大甲棍。另一方面简识,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。
5感猛、支持B/S及C/S模式七扰。
Request
上圖是一個(gè)Http請(qǐng)求消息結(jié)構(gòu),我們可以使用抓包工具抓取網(wǎng)絡(luò)請(qǐng)求,因?yàn)槭荊et請(qǐng)求陪白,所以后面沒(méi)有請(qǐng)求數(shù)據(jù)
GET /562f25980001b1b106000338.jpg HTTP/1.1
Host img.mukewang.com
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept image/webp,image/*,*/*;q=0.8
Referer http://www.imooc.com/
Accept-Encoding gzip, deflate, sdch
Accept-Language zh-CN,zh;q=0.8
第一部分:請(qǐng)求行颈走,用來(lái)說(shuō)明請(qǐng)求類(lèi)型,要訪(fǎng)問(wèn)的資源以及所使用的HTTP版本.
GET說(shuō)明請(qǐng)求類(lèi)型為GET,[/562f25980001b1b106000338.jpg]為要訪(fǎng)問(wèn)的資源,該行的最后一部分說(shuō)明使用的是HTTP1.1版本咱士。
第二部分:請(qǐng)求頭部立由,緊接著請(qǐng)求行(即第一行)之后的部分,用來(lái)說(shuō)明服務(wù)器要使用的附加信息
從第二行起為請(qǐng)求頭部序厉,HOST將指出請(qǐng)求的目的地.User-Agent,服務(wù)器端和客戶(hù)端腳本都能訪(fǎng)問(wèn)它,它是瀏覽器類(lèi)型檢測(cè)邏輯的重要基礎(chǔ).該信息由你的瀏覽器來(lái)定義,并且在每個(gè)請(qǐng)求中自動(dòng)發(fā)送等等
第三部分:空行锐膜,請(qǐng)求頭部后面的空行是必須的
即使第四部分的請(qǐng)求數(shù)據(jù)為空,也必須有空行脂矫。
第四部分:請(qǐng)求數(shù)據(jù)也叫主體,可以添加任意的其他數(shù)據(jù)霉晕。
這個(gè)例子的請(qǐng)求數(shù)據(jù)為空庭再。
下面這個(gè)例子是Post方式捞奕。
POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
第一部分:請(qǐng)求行,第一行明了是post請(qǐng)求拄轻,以及http1.1版本颅围。
第二部分:請(qǐng)求頭部,第二行至第六行恨搓。
第三部分:空行院促,第七行的空行。
第四部分:請(qǐng)求數(shù)據(jù)斧抱,第八行常拓。
Response
一般情況下,服務(wù)器接收并處理客戶(hù)端發(fā)過(guò)來(lái)的請(qǐng)求后會(huì)返回一個(gè)HTTP的響應(yīng)消息辉浦。
HTTP響應(yīng)也由四個(gè)部分組成弄抬,分別是:狀態(tài)行、消息報(bào)頭宪郊、空行和響應(yīng)正文掂恕。
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8
<html>
<head></head>
<body>
<!--body goes here-->
</body>
</html>
第一部分:狀態(tài)行,由HTTP協(xié)議版本號(hào)弛槐, 狀態(tài)碼懊亡, 狀態(tài)消息 三部分組成。
第一行為狀態(tài)行乎串,(HTTP/1.1)表明HTTP版本為1.1版本店枣,狀態(tài)碼為200,狀態(tài)消息為(ok)
第二部分:消息報(bào)頭灌闺,用來(lái)說(shuō)明客戶(hù)端要使用的一些附加信息
第二行和第三行為消息報(bào)頭艰争,
Date:生成響應(yīng)的日期和時(shí)間;Content-Type:指定了MIME類(lèi)型的HTML(text/html),編碼類(lèi)型是UTF-8
第三部分:空行桂对,消息報(bào)頭后面的空行是必須的
第四部分:響應(yīng)正文甩卓,服務(wù)器返回給客戶(hù)端的文本信息。
空行后面的html部分為響應(yīng)正文蕉斜。
Code
狀態(tài)代碼有三位數(shù)字組成逾柿,第一個(gè)數(shù)字定義了響應(yīng)的類(lèi)別,共分五種類(lèi)別:
1xx:指示信息--表示請(qǐng)求已接收宅此,繼續(xù)處理
2xx:成功--表示請(qǐng)求已被成功接收机错、理解、接受
3xx:重定向--要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作
4xx:客戶(hù)端錯(cuò)誤--請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn)
5xx:服務(wù)器端錯(cuò)誤--服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求
常見(jiàn)狀態(tài)碼:
200 OK // 客戶(hù)端請(qǐng)求成功
400 Bad Request // 客戶(hù)端請(qǐng)求有語(yǔ)法錯(cuò)誤父腕,不能被服務(wù)器所理解
401 Unauthorized // 請(qǐng)求未經(jīng)授權(quán)弱匪,這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用
403 Forbidden // 服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù)
404 Not Found // 請(qǐng)求資源不存在璧亮,eg:輸入了錯(cuò)誤的URL
500 Internal Server Error // 服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤
503 Server Unavailable // 服務(wù)器當(dāng)前不能處理客戶(hù)端的請(qǐng)求萧诫,一段時(shí)間后可能恢復(fù)正常
Method
根據(jù)HTTP標(biāo)準(zhǔn)斥难,HTTP請(qǐng)求可以使用多種請(qǐng)求方法。
HTTP1.0定義了三種請(qǐng)求方法: GET, POST 和 HEAD方法帘饶。
HTTP1.1新增了五種請(qǐng)求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法哑诊。
GET 請(qǐng)求指定的頁(yè)面信息,并返回實(shí)體主體及刻。
HEAD 類(lèi)似于get請(qǐng)求镀裤,只不過(guò)返回的響應(yīng)中沒(méi)有具體的內(nèi)容,用于獲取報(bào)頭
POST 向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)缴饭。數(shù)據(jù)被包含在請(qǐng)求體中暑劝。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改。
PUT 從客戶(hù)端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容茴扁。
DELETE 請(qǐng)求服務(wù)器刪除指定的頁(yè)面铃岔。
CONNECT HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
OPTIONS 允許客戶(hù)端查看服務(wù)器的性能峭火。
TRACE 回顯服務(wù)器收到的請(qǐng)求毁习,主要用于測(cè)試或診斷。
Header
HTTP消息由客戶(hù)端到服務(wù)器的請(qǐng)求和服務(wù)器到客戶(hù)端的響應(yīng)組成卖丸。請(qǐng)求消息和響應(yīng)消息都是由開(kāi)始行(對(duì)于請(qǐng)求消息纺且,開(kāi)始行就是請(qǐng)求行,對(duì)于響應(yīng)消息稍浆,開(kāi)始行就是狀態(tài)行)载碌,消息報(bào)頭(可選),空行(只有CRLF的行)衅枫,消息正文(可選)組成嫁艇。
HTTP消息報(bào)頭包括普通報(bào)頭、請(qǐng)求報(bào)頭弦撩、響應(yīng)報(bào)頭步咪、實(shí)體報(bào)頭。
每一個(gè)報(bào)頭域都是由名字+“:”+空格+值 組成益楼,消息報(bào)頭域的名字是大小寫(xiě)無(wú)關(guān)的猾漫。
網(wǎng)絡(luò)請(qǐng)求庫(kù)
下面介紹幾個(gè)常見(jiàn)的Android http網(wǎng)路開(kāi)發(fā)的工具庫(kù)。
URLConnection
URLConnection是Java JDK中自帶的網(wǎng)絡(luò)請(qǐng)求類(lèi)感凤,使用的場(chǎng)景不多悯周,因?yàn)槭褂帽容^繁瑣,直接使用底層IO流進(jìn)行開(kāi)發(fā)陪竿,需要了解Http協(xié)議才能很好的使用禽翼,很多時(shí)候需要自己封裝,不方便。一般的一些提供第三方服務(wù)的sdk會(huì)使用闰挡,一是為了保證sdk體積大小仇矾,二是減少不必要的第三方庫(kù)引入。
這里不做詳細(xì)介紹解总, 這里有一篇博可以詳細(xì)介紹了 。
Apache HttpClient
HttpClient是Apache Jakarta Common下的子項(xiàng)目姐仅,用來(lái)提供高效的花枫、最新的、功能豐富的支持HTTP協(xié)議的客戶(hù)端編程工具包掏膏,并且它支持HTTP協(xié)議最新的版本和建議劳翰。HttpClient已經(jīng)應(yīng)用在很多的項(xiàng)目中,比如Apache Jakarta上很著名的另外兩個(gè)開(kāi)源項(xiàng)目Cactus和HTMLUnit都使用了HttpClient馒疹。
HttpClient相比傳統(tǒng)JDK自帶的URLConnection佳簸,增加了易用性和靈活性,它不僅是客戶(hù)端發(fā)送Http請(qǐng)求變得容易颖变,而且也方便了開(kāi)發(fā)人員測(cè)試接口(基于Http協(xié)議的)生均,即提高了開(kāi)發(fā)的效率,也方便提高代碼的健壯性腥刹。
Android在低版本的系統(tǒng)Api中也有Httpclient相關(guān)類(lèi)马胧,但是后來(lái)就已經(jīng)廢棄,相關(guān)資料可以 參考這里.
Volley
Android Volley 是在2013年Google I/O大會(huì)上推出了一個(gè)新的網(wǎng)絡(luò)通信框架——Volley。Volley可是說(shuō)是把AsyncHttpClient和Universal-Image-Loader的優(yōu)點(diǎn)集于了一身衔峰,既可以像AsyncHttpClient一樣非常簡(jiǎn)單地進(jìn)行HTTP通信佩脊,也可以像Universal-Image-Loader一樣輕松加載網(wǎng)絡(luò)上的圖片。除了簡(jiǎn)單易用之外垫卤,Volley在性能方面也進(jìn)行了大幅度的調(diào)整威彰,它的設(shè)計(jì)目標(biāo)就是非常適合去進(jìn)行數(shù)據(jù)量不大,但通信頻繁的網(wǎng)絡(luò)操作穴肘,而對(duì)于大數(shù)據(jù)量的網(wǎng)絡(luò)操作歇盼,比如說(shuō)下載文件等,Volley的表現(xiàn)就會(huì)非常糟糕梢褐。
有 資料 指出Volley在進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí)旺遮,在A(yíng)ndroid 2.3及以上版本,使用的是HttpURLConnection盈咳,而在A(yíng)ndroid 2.2及以下版本耿眉,使用的是HttpClient。主要是因?yàn)镠ttpURLConnection存在相關(guān)bug鱼响。
OkHttp & Retrofit
OkHttpSquare公司開(kāi)源的處理網(wǎng)絡(luò)請(qǐng)求的開(kāi)源項(xiàng)目,是安卓端最火熱的輕量級(jí)框架鸣剪,用于替代HttpUrlConnection和Apache HttpClient。最新的版本是OkHttp3,Github地址在 這里 筐骇。
Retrofit也是是Square公司開(kāi)發(fā)的一款針對(duì)Android網(wǎng)絡(luò)請(qǐng)求的框架债鸡,Retrofit2底層基于OkHttp實(shí)現(xiàn)的,OkHttp現(xiàn)在已經(jīng)得到Google官方認(rèn)可铛纬,大量的app都采用OkHttp做網(wǎng)絡(luò)請(qǐng)求厌均, Github地址 。
網(wǎng)絡(luò)上也有很多關(guān)于OkHttp告唆、Retrofit的示例和資料棺弊,而且是目前Android移動(dòng)端最流行的框架,還是很值得了解一下擒悬,在這里就不做詳細(xì)介紹模她。
工具
Charles
Charles是一個(gè)HTTP代理服務(wù)器,HTTP監(jiān)視器,反轉(zhuǎn)代理服務(wù)器·它允許一個(gè)開(kāi)發(fā)者查看所有連接互聯(lián)網(wǎng)的HTTP通信·這些包括request、response懂牧、headers(包含cookies與caching信息)侈净,由于筆者的開(kāi)發(fā)機(jī)器是Mac,所以只介紹了Charles僧凤,Windows開(kāi)發(fā)環(huán)境的同學(xué)可以使用fiddler畜侦。
Charles 主要的功能包括:
截取 Http 和 Https 網(wǎng)絡(luò)封包。
支持網(wǎng)絡(luò)請(qǐng)求調(diào)試躯保,設(shè)置斷點(diǎn)夏伊,方便調(diào)試
支持重發(fā)網(wǎng)絡(luò)請(qǐng)求,方便后端調(diào)試吻氧。
支持修改網(wǎng)絡(luò)請(qǐng)求參數(shù)溺忧。
支持網(wǎng)絡(luò)請(qǐng)求的截獲并動(dòng)態(tài)修改。
支持模擬弱網(wǎng)盯孙。
上面介紹了鲁森,可以使用Charles方便設(shè)置斷點(diǎn),方便調(diào)試振惰,可以很容易的修改數(shù)據(jù)包歌溉,這樣可以動(dòng)態(tài)修改數(shù)據(jù),mock api接口骑晶,在實(shí)際開(kāi)發(fā)過(guò)程中很有用痛垛。
PostMan & Paw
上面介紹了網(wǎng)絡(luò)抓包工具Charles,先介紹2款模擬http請(qǐng)求的軟件桶蛔。
Postman是一款功能強(qiáng)大的網(wǎng)頁(yè)調(diào)試與發(fā)送網(wǎng)頁(yè)HTTP請(qǐng)求的Chrome插件,使用很簡(jiǎn)單匙头。
下圖模擬發(fā)送知乎Api的網(wǎng)絡(luò)請(qǐng)求。
http://news-at.zhihu.com/api/4/themes
Paw 也是類(lèi)似于Postman的一款模擬http請(qǐng)求的軟件仔雷,只不過(guò)postman依賴(lài)于chrome蹂析,經(jīng)常需要點(diǎn)擊2此才可以打開(kāi)postman舔示,所以個(gè)人更加喜歡paw,下圖是paw請(qǐng)求知乎api的示例电抚。BTW, paw是一款收費(fèi)的軟件惕稻,不過(guò)么網(wǎng)上也有破解的,在這里就不介紹如何獲取了蝙叛,反正大家都懂的俺祠。
Chrome Dev Tools
Chrome dev tools是Google Chrome瀏覽器中自帶一塊調(diào)試工具。如果你是做軟件開(kāi)發(fā)的借帘,基本都了解過(guò)锻煌。
雖然Chrome dev tools 在web開(kāi)發(fā)中使用很多,但是在移動(dòng)端中也是有用到的姻蚓,這個(gè)后面再介紹。
curl
curl也是和上面poastman與paw功能類(lèi)似的匣沼,不過(guò)沒(méi)有和上面兩款放在一起講是因?yàn)閏url比較重要狰挡,而且具有統(tǒng)一標(biāo)準(zhǔn)性與方便性。
curl是利用URL語(yǔ)法在命令行方式下工作的開(kāi)源文件傳輸工具释涛。它被廣泛應(yīng)用在Unix加叁、多種Linux發(fā)行版中,并且有DOS和Win32唇撬、Win64下的移植版本它匕。
還是原先的例子,請(qǐng)求知乎的api窖认。
很簡(jiǎn)單在curl命令直接加入url即可發(fā)送網(wǎng)絡(luò)請(qǐng)求豫柬。
為什么有postman和paw這么友好的軟件后,還需要介紹的curl呢扑浸,因?yàn)閏url是一個(gè)命令烧给,是文本,是字符串喝噪,當(dāng)你其他同事開(kāi)發(fā)聯(lián)調(diào)的時(shí)候础嫡,直接通過(guò)im工具發(fā)送即可,這樣網(wǎng)絡(luò)請(qǐng)求就能很容移動(dòng)復(fù)現(xiàn)酝惧。很多的上面介紹的charles榴鼎、paw、google dev tool都支持把某一條請(qǐng)求導(dǎo)出為curl命令晚唇。這就相當(dāng)于curl是一個(gè)標(biāo)準(zhǔn)巫财,可以在不同機(jī)器上面復(fù)用,所以了解和使用curl是很有必要的哩陕。比如聯(lián)調(diào)開(kāi)發(fā)時(shí)候翁涤,服務(wù)器某個(gè)api調(diào)試不通過(guò)桥言,需要與服務(wù)器同學(xué)溝通與復(fù)習(xí),你直接丟一個(gè)curl語(yǔ)句即可葵礼,如果對(duì)方很懂号阿,那么會(huì)覺(jué)的你很專(zhuān)業(yè),如果對(duì)方不懂鸳粉,順便可以裝個(gè)逼扔涧。
OkHttp相關(guān)
前面介紹了OkHttp,下面介紹幾個(gè)基于OkHttp攔截器機(jī)制衍生出的常用的工具届谈。
logging-interceptor
開(kāi)發(fā)中經(jīng)常需要對(duì)網(wǎng)絡(luò)請(qǐng)求進(jìn)行查看枯夜,抓包是可以的,不過(guò)現(xiàn)在很多app都是全棧https艰山,想要抓包就沒(méi)有那么容易了湖雹,那么最簡(jiǎn)單的還是打日志。
logging-interceptor
就是干這個(gè)事的曙搬,在初始化okhttpclient的時(shí)候摔吏,添加下這個(gè)攔截器,那么所有的網(wǎng)絡(luò)請(qǐng)求會(huì)被記錄下來(lái)纵装。
Stetho
Stetho是Facebook開(kāi)源的一個(gè)工具征讲,前面說(shuō)過(guò)Google Chrome dev tools,那么Stetho可以讓Chrome調(diào)試Android橡娄,監(jiān)控網(wǎng)絡(luò)請(qǐng)求诗箍。
同時(shí)Stetho還支持查看數(shù)據(jù)庫(kù),SharePreference等挽唉,而這個(gè)前提是必須root滤祖,查看view樹(shù),使用Stetho也可以做到瓶籽。
網(wǎng)上也有很多也有很多相關(guān)資料氨距,這里不介紹詳細(xì)使用。
chuck
上面介紹的兩款工具棘劣,一種是需要在logcat中查看網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)俏让,一種是需要在chrome中查看數(shù)據(jù),有沒(méi)有辦法不需要借助任何第三方工具茬暇,直接查看呢首昔,答案是肯定的。chuck是我最近關(guān)注比較高的一個(gè)開(kāi)源工具糙俗,而且很快的就在項(xiàng)目中使用了勒奇。
下面官網(wǎng)的截圖,可以先了解下chuck的使用效果巧骚。
在高版本的Android中赊颠,還支持多屏顯示格二,那么一邊操作一邊顯示。
集成的方法都很簡(jiǎn)單竣蹦,只需要在初始化OkHttpClient的時(shí)候顶猜,添加對(duì)應(yīng)的攔截器即可。
Gradle依賴(lài)
dependencies {
debugCompile 'com.readystatesoftware.chuck:library:1.0.4'
releaseCompile 'com.readystatesoftware.chuck:library-no-op:1.0.4'
}
添加攔截器
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new ChuckInterceptor(context))
.build();
其他
RESTful
RESTful一種軟件架構(gòu)風(fēng)格痘括,設(shè)計(jì)風(fēng)格而不是標(biāo)準(zhǔn)长窄,只是提供了一組設(shè)計(jì)原則和約束條件。它主要用于客戶(hù)端和服務(wù)器交互類(lèi)的軟件纲菌∧尤眨基于這個(gè)風(fēng)格設(shè)計(jì)的軟件可以更簡(jiǎn)潔,更有層次翰舌,更易于實(shí)現(xiàn)緩存等機(jī)制嚣潜。
REST(英文:Representational State Transfer,簡(jiǎn)稱(chēng)REST)描述了一個(gè)架構(gòu)樣式的網(wǎng)絡(luò)系統(tǒng)椅贱,比如 web 應(yīng)用程序懂算。它首次出現(xiàn)在 2000 年 Roy Fielding 的博士論文中,他是 HTTP 規(guī)范的主要編寫(xiě)者之一夜涕。在目前主流的三種Web服務(wù)交互方案中,REST相比于SOAP(Simple Object Access protocol属愤,簡(jiǎn)單對(duì)象訪(fǎng)問(wèn)協(xié)議)以及XML-RPC更加簡(jiǎn)單明了女器,無(wú)論是對(duì)URL的處理還是對(duì)Payload的編碼,REST都傾向于用更加簡(jiǎn)單輕量的方法設(shè)計(jì)和實(shí)現(xiàn)住诸。值得注意的是REST并沒(méi)有一個(gè)明確的標(biāo)準(zhǔn)驾胆,而更像是一種設(shè)計(jì)的風(fēng)格。
雖然本文的主題是介紹Android Http開(kāi)發(fā)的相關(guān)內(nèi)容贱呐,并且RESTful是服務(wù)端的一種概念丧诺。但是我覺(jué)的,還是有很必要了解的奄薇,最起碼可以作為判斷你的服務(wù)端小伙伴給的接口是否滿(mǎn)足RESTful的標(biāo)準(zhǔn)的依據(jù)驳阎。
后面貼一篇阮一峰大神的博客介紹RESTful
總結(jié)
心得
上面介紹了很多種關(guān)于網(wǎng)絡(luò)請(qǐng)求的工具,具體可以分為這幾類(lèi)馁蒂。
HTTP接口調(diào)用工具呵晚,這類(lèi)工具主要是模擬客戶(hù)端,發(fā)起網(wǎng)絡(luò)請(qǐng)求沫屡,方便調(diào)試服務(wù)器接口饵隙。
- postman
- paw
- curl
抓包工具,這類(lèi)工具不光適合Android開(kāi)發(fā)沮脖,也適合其他網(wǎng)絡(luò)開(kāi)發(fā)金矛,工具使用簡(jiǎn)單芯急,不過(guò)在使用前需要做少許代理配置。WiresShark是一款更加強(qiáng)大的工具驶俊,使用比較復(fù)雜娶耍,而且比較底層,所以在本文中就沒(méi)介紹废睦,有興趣的同學(xué)可以自己查閱相關(guān)資料伺绽。
- Charles
- Fiddler
- WiresShark
Android Http請(qǐng)求工具庫(kù),這類(lèi)工具類(lèi)變化很快嗜湃,經(jīng)常會(huì)過(guò)個(gè)幾年就會(huì)有新的一種工具替換奈应,但是本質(zhì)思想還是一樣的,都是基于URLConnection和HTTP做了一次封裝調(diào)用购披。
- URLConnection
- HttpClient
- Volley
- OkHttp
OkHttp相關(guān)杖挣,這類(lèi)工具都是基于OkHttp做了二次封裝開(kāi)發(fā),這個(gè)主要?dú)w功于OkHttp強(qiáng)大開(kāi)發(fā)模式和架構(gòu)刚陡,開(kāi)發(fā)人員可以方便對(duì)OkHttp進(jìn)行自定義和二次開(kāi)發(fā)惩妇。工具很強(qiáng)大,不過(guò)也有局限性筐乳,只能依附于OkHttp的框架歌殃,不利于擴(kuò)展到其他平臺(tái)和工具。
- logging-interceptor
- Stetho
- Chuck
工具對(duì)比
上面介紹好幾款可以監(jiān)控App網(wǎng)絡(luò)請(qǐng)求的工具蝙云,那么如何根據(jù)實(shí)際情況氓皱,選擇一款適合自己項(xiàng)目和團(tuán)隊(duì)的工具呢?
Charles & Fiddler
這類(lèi)工具不依賴(lài)與平臺(tái)和App開(kāi)發(fā)的工具庫(kù)勃刨,不管你是Android波材、還是iOS,不管使用的是Volley身隐,還是OkHttp都是可以監(jiān)控的廷区,同時(shí)還支持HTTP的調(diào)試,方便mock數(shù)據(jù)贾铝,簡(jiǎn)直是神器隙轻。
不過(guò)也有少許缺點(diǎn),比如是不支持Https垢揩,如果你的app使用的是https接口大脉,那么這類(lèi)工具一般情況是不能使用的,不過(guò)也有辦法水孩,比如把charles的證書(shū)設(shè)置為根證書(shū)镰矿,則可以檢測(cè)到。但是也是有局限的俘种,如果app設(shè)置強(qiáng)制校驗(yàn)https證書(shū)秤标,此類(lèi)方法還是不可行绝淡。
因?yàn)槠脚_(tái)無(wú)光,可檢測(cè)到某個(gè)手機(jī)設(shè)備上面的全部網(wǎng)絡(luò)請(qǐng)求苍姜,數(shù)據(jù)量有時(shí)候會(huì)很大牢酵,如果經(jīng)常調(diào)試某一個(gè)app,那么域名一般是固定的衙猪,可進(jìn)行相對(duì)應(yīng)的過(guò)濾馍乙。
OkHttp相關(guān)
通過(guò)標(biāo)題可以看成,此類(lèi)工具必須依附于OKHttp垫释,那么只能滿(mǎn)足Android平臺(tái)并且App的網(wǎng)絡(luò)請(qǐng)求庫(kù)是OkHttp丝格。上面介紹的三款工具,可以選擇性的選擇其中幾種或者是全部棵譬,暫時(shí)還沒(méi)有發(fā)現(xiàn)沖突的地方显蝌。因?yàn)槭侵苯忧度氲酱a中,那么Https也是可以監(jiān)控到订咸。同時(shí)也只能監(jiān)控當(dāng)前設(shè)備上的當(dāng)前應(yīng)用曼尊,不可以檢測(cè)其他的app。
不過(guò)在發(fā)布線(xiàn)上或者正式頒布時(shí)脏嚷,需要手動(dòng)去除這些代碼骆撇,否則會(huì)有很大麻煩,同時(shí)也會(huì)把相關(guān)的隱私和安全反饋給使用的用戶(hù)父叙。
好了神郊,上面就是關(guān)于A(yíng)pp網(wǎng)絡(luò)情況的監(jiān)控工具比較,建議兩個(gè)大分類(lèi)都可以幾個(gè)或者多個(gè)配合使用高每,具體問(wèn)題在根據(jù)具體工具使用屿岂,方便問(wèn)題解決與網(wǎng)絡(luò)監(jiān)控践宴。
其他建議
上面介紹的OkHttp的相關(guān)的工具鲸匿,都是需要在初始化OkHttpClient的時(shí)候,手動(dòng)添加對(duì)應(yīng)的攔截器阻肩,如果忘記添加則不會(huì)產(chǎn)生效果带欢。
那么可以使用現(xiàn)在流行的Aop技術(shù),在編譯時(shí)候烤惊,會(huì)在所有調(diào)用OkHttpClient的地方乔煞,自動(dòng)添加,保證不會(huì)忘記柒室,如果你的App還是用其他的sdk渡贾,sdk里面也是用OKhttp的話(huà),也會(huì)監(jiān)控到sdk里面的網(wǎng)絡(luò)請(qǐng)求雄右,不少大廠(chǎng)已經(jīng)使用了這種方法空骚,然后收集請(qǐng)求數(shù)據(jù)到后端纺讲,方便管理和優(yōu)化。
下面簡(jiǎn)單介紹相關(guān)代碼:
首先集成gradle_plugin_android_aspectjx
插件
dependencies {
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.9'
}
然后定義Aspectj切入點(diǎn)
import com.facebook.stetho.okhttp3.StethoInterceptor;
import com.readystatesoftware.chuck.ChuckInterceptor;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import me.ele.breakfastapp.AppContext;
import okhttp3.OkHttpClient;
@Aspect
public class OkHttpAspect {
@Pointcut("call(public okhttp3.OkHttpClient build())")
public void build() {
}
@Around("build()")
public Object aroundBuild(ProceedingJoinPoint joinPoint) throws Throwable {
Object target = joinPoint.getTarget();
if (target instanceof OkHttpClient.Builder) {
OkHttpClient.Builder builder = (OkHttpClient.Builder) target;
builder.addNetworkInterceptor(new StethoInterceptor());
builder.addNetworkInterceptor(new ChuckInterceptor(AppContext.get()));
}
return joinPoint.proceed();
}
}
那么在代碼編譯的時(shí)候囤屹,會(huì)自動(dòng)插入字節(jié)碼熬甚。
Aop相關(guān)資料: