Android Http網(wǎng)絡(luò)開(kāi)發(fā)神兵利器

Android Http網(wǎng)絡(luò)開(kāi)發(fā)神兵利器


本人在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)信息。

image

主要特點(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

Http請(qǐng)求消息結(jié)構(gòu)

上圖是一個(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響應(yīng)消息結(jié)構(gòu)
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)資料可以 參考這里.

HttpClient相關(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鱼响。

Volley相關(guān)資料

Volley相關(guān)資料

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介紹

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ò)程中很有用痛垛。

Charles Mock 數(shù)據(jù)

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

image

Postman官網(wǎng)

Postman資料

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)上也有破解的,在這里就不介紹如何獲取了蝙叛,反正大家都懂的俺祠。

image

Paw 官網(wǎng)

Paw 使用教程

Chrome Dev Tools

Chrome dev tools是Google Chrome瀏覽器中自帶一塊調(diào)試工具。如果你是做軟件開(kāi)發(fā)的借帘,基本都了解過(guò)锻煌。

雖然Chrome dev tools 在web開(kāi)發(fā)中使用很多,但是在移動(dòng)端中也是有用到的姻蚓,這個(gè)后面再介紹。

image

Chrome dev tools 相關(guān)資料

Chrome dev tools 相關(guān)資料

Chrome dev tools 相關(guān)資料

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窖认。

image

很簡(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è)逼扔涧。

curl 資料

curl 官網(wǎng)

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)纵装。

相關(guān)資料

相關(guān)資料

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ì)使用。

stetho github

stetho 相關(guān)資料

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的使用效果巧骚。

image

在高版本的Android中赊颠,還支持多屏顯示格二,那么一邊操作一邊顯示。

image

集成的方法都很簡(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();

Chuck github

其他

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)資料:

Aop介紹

Aop資料

Assectj

Assectj Gradle 插件

參考資料

Http博客

Http博客

URLConnection

Android HttpClient

HttpClient相關(guān)博客

Volley相關(guān)資料

Volley相關(guān)資料

OkHttp

Retrofit Github地址

Charles介紹

Charles Mock 數(shù)據(jù)

Postman官網(wǎng)

Postman資料

Paw 官網(wǎng)

Paw 使用教程

Chrome dev tools 相關(guān)資料

Chrome dev tools 相關(guān)資料

Chrome dev tools 相關(guān)資料

curl 資料

curl 官網(wǎng)

Interceptors相關(guān)資料

LoggingInterceptors相關(guān)資料

stetho github

stetho 相關(guān)資料

Chuck github

RESTful

Aop介紹

Aop資料

Assectj

Assectj Gradle 插件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市肋坚,隨后出現(xiàn)的幾起案子乡括,更是在濱河造成了極大的恐慌,老刑警劉巖智厌,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诲泌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡峦剔,警方通過(guò)查閱死者的電腦和手機(jī)档礁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吝沫,“玉大人呻澜,你說(shuō)我怎么就攤上這事〔蚁眨” “怎么了羹幸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)辫愉。 經(jīng)常有香客問(wèn)我栅受,道長(zhǎng),這世上最難降的妖魔是什么恭朗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任屏镊,我火速辦了婚禮,結(jié)果婚禮上痰腮,老公的妹妹穿的比我還像新娘而芥。我一直安慰自己,他們只是感情好膀值,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布棍丐。 她就那樣靜靜地躺著,像睡著了一般沧踏。 火紅的嫁衣襯著肌膚如雪歌逢。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天翘狱,我揣著相機(jī)與錄音秘案,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛阱高,可吹牛的內(nèi)容都是我干的师骗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼讨惩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辟癌!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起荐捻,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤黍少,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后处面,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體厂置,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年魂角,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昵济。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡野揪,死狀恐怖访忿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斯稳,我是刑警寧澤海铆,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站挣惰,受9級(jí)特大地震影響卧斟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜憎茂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一珍语、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧竖幔,春花似錦板乙、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)晓猛。三九已至饿幅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間戒职,已是汗流浹背栗恩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洪燥,地道東北人磕秤。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓乳乌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親市咆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子汉操,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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