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

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


本人在Android移動(dòng)端開發(fā)已經(jīng)有不少年的經(jīng)驗(yàn),經(jīng)歷頗多,感受頗深,特寫下此文記錄下在Android Http網(wǎng)絡(luò)開發(fā)中的各種工具使用,如果有其他想法和建議,歡迎前來交流 xiaqiulei@126.com 。 本人文筆較差,請不要見怪。

Android開發(fā)的時(shí)候,很多APP都是基于網(wǎng)絡(luò)請求的,大部分應(yīng)用都是基于http的,少部分是基于Socket的,本文主要介紹Android Http開發(fā)的主要實(shí)踐和工具。

本文最先發(fā)表于Github,如有轉(zhuǎn)載,請注明轉(zhuǎn)載出處。

Http協(xié)議

說起Http網(wǎng)絡(luò)請求,那么要介紹下Http協(xié)議,我在公司面試的時(shí)候也很喜歡問這個(gè)問題。很多做好了3-5年的工程師,竟然不知道Http協(xié)議,只知道怎么調(diào)用類庫,不知道原理。

作為一個(gè)有追求的程序員,Http協(xié)議還是需要了解的。知其然知其所以然,在了解Http協(xié)議的情況下,才能在實(shí)際開發(fā)中靈活運(yùn)用和優(yōu)化。

這里有篇 文章 ,Http協(xié)議介紹的很詳細(xì)。

HTTP簡介

HTTP協(xié)議是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫,是用于從萬維網(wǎng)(WWW:World Wide Web )服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議。

HTTP是一個(gè)基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù)(HTML 文件, 圖片文件, 查詢結(jié)果等)。

HTTP是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統(tǒng)。它于1990年提出,經(jīng)過幾年的使用與發(fā)展,得到不斷地完善和擴(kuò)展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規(guī)范化工作正在進(jìn)行之中,而且HTTP-NG(Next Generation of HTTP)的建議已經(jīng)提出。

HTTP協(xié)議工作于客戶端-服務(wù)端架構(gòu)為上。瀏覽器作為HTTP客戶端通過URL向HTTP服務(wù)端即WEB服務(wù)器發(fā)送所有請求。Web服務(wù)器根據(jù)接收到的請求后,向客戶端發(fā)送響應(yīng)信息。

image

主要特點(diǎn)

1、簡單快速:客戶向服務(wù)器請求服務(wù)時(shí),只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同。由于HTTP協(xié)議簡單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。

2、靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對象。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。

3.無連接:無連接的含義是限制每次連接只處理一個(gè)請求。服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間。

4.無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。

5、支持B/S及C/S模式。

Request

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

上圖是一個(gè)Http請求消息結(jié)構(gòu),我們可以使用抓包工具抓取網(wǎng)絡(luò)請求,因?yàn)槭荊et請求,所以后面沒有請求數(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

第一部分:請求行,用來說明請求類型,要訪問的資源以及所使用的HTTP版本.

GET說明請求類型為GET,[/562f25980001b1b106000338.jpg]為要訪問的資源,該行的最后一部分說明使用的是HTTP1.1版本。

第二部分:請求頭部,緊接著請求行(即第一行)之后的部分,用來說明服務(wù)器要使用的附加信息

從第二行起為請求頭部,HOST將指出請求的目的地.User-Agent,服務(wù)器端和客戶端腳本都能訪問它,它是瀏覽器類型檢測邏輯的重要基礎(chǔ).該信息由你的瀏覽器來定義,并且在每個(gè)請求中自動(dòng)發(fā)送等等

第三部分:空行,請求頭部后面的空行是必須的

即使第四部分的請求數(shù)據(jù)為空,也必須有空行。

第四部分:請求數(shù)據(jù)也叫主體,可以添加任意的其他數(shù)據(jù)。

這個(gè)例子的請求數(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

第一部分:請求行,第一行明了是post請求,以及http1.1版本。

第二部分:請求頭部,第二行至第六行。

第三部分:空行,第七行的空行。

第四部分:請求數(shù)據(jù),第八行。

Response

一般情況下,服務(wù)器接收并處理客戶端發(fā)過來的請求后會(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é)議版本號, 狀態(tài)碼, 狀態(tài)消息 三部分組成。

第一行為狀態(tài)行,(HTTP/1.1)表明HTTP版本為1.1版本,狀態(tài)碼為200,狀態(tài)消息為(ok)

第二部分:消息報(bào)頭,用來說明客戶端要使用的一些附加信息

第二行和第三行為消息報(bào)頭,
Date:生成響應(yīng)的日期和時(shí)間;Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8

第三部分:空行,消息報(bào)頭后面的空行是必須的

第四部分:響應(yīng)正文,服務(wù)器返回給客戶端的文本信息。

空行后面的html部分為響應(yīng)正文。

Code

狀態(tài)代碼有三位數(shù)字組成,第一個(gè)數(shù)字定義了響應(yīng)的類別,共分五種類別:

1xx:指示信息--表示請求已接收,繼續(xù)處理

2xx:成功--表示請求已被成功接收、理解、接受

3xx:重定向--要完成請求必須進(jìn)行更進(jìn)一步的操作

4xx:客戶端錯(cuò)誤--請求有語法錯(cuò)誤或請求無法實(shí)現(xiàn)

5xx:服務(wù)器端錯(cuò)誤--服務(wù)器未能實(shí)現(xiàn)合法的請求

常見狀態(tài)碼:

200 OK                        // 客戶端請求成功
400 Bad Request               // 客戶端請求有語法錯(cuò)誤,不能被服務(wù)器所理解
401 Unauthorized              // 請求未經(jīng)授權(quán),這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用
403 Forbidden                 // 服務(wù)器收到請求,但是拒絕提供服務(wù)
404 Not Found                 // 請求資源不存在,eg:輸入了錯(cuò)誤的URL
500 Internal Server Error     // 服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤
503 Server Unavailable        // 服務(wù)器當(dāng)前不能處理客戶端的請求,一段時(shí)間后可能恢復(fù)正常

Method

根據(jù)HTTP標(biāo)準(zhǔn),HTTP請求可以使用多種請求方法。
HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

GET     請求指定的頁面信息,并返回實(shí)體主體。
HEAD     類似于get請求,只不過返回的響應(yīng)中沒有具體的內(nèi)容,用于獲取報(bào)頭
POST     向指定資源提交數(shù)據(jù)進(jìn)行處理請求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請求體中。POST請求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改。
PUT     從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容。
DELETE      請求服務(wù)器刪除指定的頁面。
CONNECT     HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
OPTIONS     允許客戶端查看服務(wù)器的性能。
TRACE     回顯服務(wù)器收到的請求,主要用于測試或診斷。

Header

HTTP消息由客戶端到服務(wù)器的請求和服務(wù)器到客戶端的響應(yīng)組成。請求消息和響應(yīng)消息都是由開始行(對于請求消息,開始行就是請求行,對于響應(yīng)消息,開始行就是狀態(tài)行),消息報(bào)頭(可選),空行(只有CRLF的行),消息正文(可選)組成。

HTTP消息報(bào)頭包括普通報(bào)頭、請求報(bào)頭、響應(yīng)報(bào)頭、實(shí)體報(bào)頭。
每一個(gè)報(bào)頭域都是由名字+“:”+空格+值 組成,消息報(bào)頭域的名字是大小寫無關(guān)的。

網(wǎng)絡(luò)請求庫

下面介紹幾個(gè)常見的Android http網(wǎng)路開發(fā)的工具庫。

URLConnection

URLConnection是Java JDK中自帶的網(wǎng)絡(luò)請求類,使用的場景不多,因?yàn)槭褂帽容^繁瑣,直接使用底層IO流進(jìn)行開發(fā),需要了解Http協(xié)議才能很好的使用,很多時(shí)候需要自己封裝,不方便。一般的一些提供第三方服務(wù)的sdk會(huì)使用,一是為了保證sdk體積大小,二是減少不必要的第三方庫引入。

這里不做詳細(xì)介紹, 這里有一篇博可以詳細(xì)介紹了

Apache HttpClient

HttpClient是Apache Jakarta Common下的子項(xiàng)目,用來提供高效的、最新的、功能豐富的支持HTTP協(xié)議的客戶端編程工具包,并且它支持HTTP協(xié)議最新的版本和建議。HttpClient已經(jīng)應(yīng)用在很多的項(xiàng)目中,比如Apache Jakarta上很著名的另外兩個(gè)開源項(xiàng)目Cactus和HTMLUnit都使用了HttpClient。

HttpClient相比傳統(tǒng)JDK自帶的URLConnection,增加了易用性和靈活性,它不僅是客戶端發(fā)送Http請求變得容易,而且也方便了開發(fā)人員測試接口(基于Http協(xié)議的),即提高了開發(fā)的效率,也方便提高代碼的健壯性。

Android在低版本的系統(tǒng)Api中也有Httpclient相關(guān)類,但是后來就已經(jīng)廢棄,相關(guān)資料可以 參考這里.

HttpClient相關(guān)博客

Volley

Android Volley 是在2013年Google I/O大會(huì)上推出了一個(gè)新的網(wǎng)絡(luò)通信框架——Volley。Volley可是說是把AsyncHttpClient和Universal-Image-Loader的優(yōu)點(diǎn)集于了一身,既可以像AsyncHttpClient一樣非常簡單地進(jìn)行HTTP通信,也可以像Universal-Image-Loader一樣輕松加載網(wǎng)絡(luò)上的圖片。除了簡單易用之外,Volley在性能方面也進(jìn)行了大幅度的調(diào)整,它的設(shè)計(jì)目標(biāo)就是非常適合去進(jìn)行數(shù)據(jù)量不大,但通信頻繁的網(wǎng)絡(luò)操作,而對于大數(shù)據(jù)量的網(wǎng)絡(luò)操作,比如說下載文件等,Volley的表現(xiàn)就會(huì)非常糟糕。

資料 指出Volley在進(jìn)行網(wǎng)絡(luò)請求時(shí),在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及以下版本,使用的是HttpClient。主要是因?yàn)镠ttpURLConnection存在相關(guān)bug。

Volley相關(guān)資料

Volley相關(guān)資料

OkHttp & Retrofit

OkHttpSquare公司開源的處理網(wǎng)絡(luò)請求的開源項(xiàng)目,是安卓端最火熱的輕量級框架,用于替代HttpUrlConnection和Apache HttpClient。最新的版本是OkHttp3,Github地址在 這里

Retrofit也是是Square公司開發(fā)的一款針對Android網(wǎng)絡(luò)請求的框架,Retrofit2底層基于OkHttp實(shí)現(xiàn)的,OkHttp現(xiàn)在已經(jīng)得到Google官方認(rèn)可,大量的app都采用OkHttp做網(wǎng)絡(luò)請求, Github地址

網(wǎng)絡(luò)上也有很多關(guān)于OkHttp、Retrofit的示例和資料,而且是目前Android移動(dòng)端最流行的框架,還是很值得了解一下,在這里就不做詳細(xì)介紹。

工具

Charles

Charles是一個(gè)HTTP代理服務(wù)器,HTTP監(jiān)視器,反轉(zhuǎn)代理服務(wù)器·它允許一個(gè)開發(fā)者查看所有連接互聯(lián)網(wǎng)的HTTP通信·這些包括request、response、headers(包含cookies與caching信息),由于筆者的開發(fā)機(jī)器是Mac,所以只介紹了Charles,Windows開發(fā)環(huán)境的同學(xué)可以使用fiddler。

Charles介紹

Charles 主要的功能包括:

截取 Http 和 Https 網(wǎng)絡(luò)封包。

支持網(wǎng)絡(luò)請求調(diào)試,設(shè)置斷點(diǎn),方便調(diào)試

支持重發(fā)網(wǎng)絡(luò)請求,方便后端調(diào)試。

支持修改網(wǎng)絡(luò)請求參數(shù)。

支持網(wǎng)絡(luò)請求的截獲并動(dòng)態(tài)修改。

支持模擬弱網(wǎng)。

上面介紹了,可以使用Charles方便設(shè)置斷點(diǎn),方便調(diào)試,可以很容易的修改數(shù)據(jù)包,這樣可以動(dòng)態(tài)修改數(shù)據(jù),mock api接口,在實(shí)際開發(fā)過程中很有用。

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

PostMan & Paw

上面介紹了網(wǎng)絡(luò)抓包工具Charles,先介紹2款模擬http請求的軟件。

Postman是一款功能強(qiáng)大的網(wǎng)頁調(diào)試與發(fā)送網(wǎng)頁HTTP請求的Chrome插件,使用很簡單。

下圖模擬發(fā)送知乎Api的網(wǎng)絡(luò)請求。

http://news-at.zhihu.com/api/4/themes

image

Postman官網(wǎng)

Postman資料

Paw 也是類似于Postman的一款模擬http請求的軟件,只不過postman依賴于chrome,經(jīng)常需要點(diǎn)擊2此才可以打開postman,所以個(gè)人更加喜歡paw,下圖是paw請求知乎api的示例。BTW, paw是一款收費(fèi)的軟件,不過么網(wǎng)上也有破解的,在這里就不介紹如何獲取了,反正大家都懂的。

image

Paw 官網(wǎng)

Paw 使用教程

Chrome Dev Tools

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

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

image

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

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

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

curl

curl也是和上面poastman與paw功能類似的,不過沒有和上面兩款放在一起講是因?yàn)閏url比較重要,而且具有統(tǒng)一標(biāo)準(zhǔn)性與方便性。

curl是利用URL語法在命令行方式下工作的開源文件傳輸工具。它被廣泛應(yīng)用在Unix、多種Linux發(fā)行版中,并且有DOS和Win32、Win64下的移植版本。

還是原先的例子,請求知乎的api。

image

很簡單在curl命令直接加入url即可發(fā)送網(wǎng)絡(luò)請求。

為什么有postman和paw這么友好的軟件后,還需要介紹的curl呢,因?yàn)閏url是一個(gè)命令,是文本,是字符串,當(dāng)你其他同事開發(fā)聯(lián)調(diào)的時(shí)候,直接通過im工具發(fā)送即可,這樣網(wǎng)絡(luò)請求就能很容移動(dòng)復(fù)現(xiàn)。很多的上面介紹的charles、paw、google dev tool都支持把某一條請求導(dǎo)出為curl命令。這就相當(dāng)于curl是一個(gè)標(biāo)準(zhǔn),可以在不同機(jī)器上面復(fù)用,所以了解和使用curl是很有必要的。比如聯(lián)調(diào)開發(fā)時(shí)候,服務(wù)器某個(gè)api調(diào)試不通過,需要與服務(wù)器同學(xué)溝通與復(fù)習(xí),你直接丟一個(gè)curl語句即可,如果對方很懂,那么會(huì)覺的你很專業(yè),如果對方不懂,順便可以裝個(gè)逼。

curl 資料

curl 官網(wǎng)

OkHttp相關(guān)

前面介紹了OkHttp,下面介紹幾個(gè)基于OkHttp攔截器機(jī)制衍生出的常用的工具。

logging-interceptor

開發(fā)中經(jīng)常需要對網(wǎng)絡(luò)請求進(jìn)行查看,抓包是可以的,不過現(xiàn)在很多app都是全棧https,想要抓包就沒有那么容易了,那么最簡單的還是打日志。

logging-interceptor就是干這個(gè)事的,在初始化okhttpclient的時(shí)候,添加下這個(gè)攔截器,那么所有的網(wǎng)絡(luò)請求會(huì)被記錄下來。

相關(guān)資料

相關(guān)資料

Stetho

Stetho是Facebook開源的一個(gè)工具,前面說過Google Chrome dev tools,那么Stetho可以讓Chrome調(diào)試Android,監(jiān)控網(wǎng)絡(luò)請求。

同時(shí)Stetho還支持查看數(shù)據(jù)庫,SharePreference等,而這個(gè)前提是必須root,查看view樹,使用Stetho也可以做到。

網(wǎng)上也有很多也有很多相關(guān)資料,這里不介紹詳細(xì)使用。

stetho github

stetho 相關(guān)資料

chuck

上面介紹的兩款工具,一種是需要在logcat中查看網(wǎng)絡(luò)請求數(shù)據(jù),一種是需要在chrome中查看數(shù)據(jù),有沒有辦法不需要借助任何第三方工具,直接查看呢,答案是肯定的。chuck是我最近關(guān)注比較高的一個(gè)開源工具,而且很快的就在項(xiàng)目中使用了。

下面官網(wǎng)的截圖,可以先了解下chuck的使用效果。

image

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

image

集成的方法都很簡單,只需要在初始化OkHttpClient的時(shí)候,添加對應(yīng)的攔截器即可。

Gradle依賴

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ì)原則和約束條件。它主要用于客戶端和服務(wù)器交互類的軟件。基于這個(gè)風(fēng)格設(shè)計(jì)的軟件可以更簡潔,更有層次,更易于實(shí)現(xiàn)緩存等機(jī)制。

REST(英文:Representational State Transfer,簡稱REST)描述了一個(gè)架構(gòu)樣式的網(wǎng)絡(luò)系統(tǒng),比如 web 應(yīng)用程序。它首次出現(xiàn)在 2000 年 Roy Fielding 的博士論文中,他是 HTTP 規(guī)范的主要編寫者之一。在目前主流的三種Web服務(wù)交互方案中,REST相比于SOAP(Simple Object Access protocol,簡單對象訪問協(xié)議)以及XML-RPC更加簡單明了,無論是對URL的處理還是對Payload的編碼,REST都傾向于用更加簡單輕量的方法設(shè)計(jì)和實(shí)現(xiàn)。值得注意的是REST并沒有一個(gè)明確的標(biāo)準(zhǔn),而更像是一種設(shè)計(jì)的風(fēng)格。

雖然本文的主題是介紹Android Http開發(fā)的相關(guān)內(nèi)容,并且RESTful是服務(wù)端的一種概念。但是我覺的,還是有很必要了解的,最起碼可以作為判斷你的服務(wù)端小伙伴給的接口是否滿足RESTful的標(biāo)準(zhǔn)的依據(jù)。

后面貼一篇阮一峰大神的博客介紹RESTful

總結(jié)

心得

上面介紹了很多種關(guān)于網(wǎng)絡(luò)請求的工具,具體可以分為這幾類。

HTTP接口調(diào)用工具,這類工具主要是模擬客戶端,發(fā)起網(wǎng)絡(luò)請求,方便調(diào)試服務(wù)器接口。

  • postman
  • paw
  • curl

抓包工具,這類工具不光適合Android開發(fā),也適合其他網(wǎng)絡(luò)開發(fā),工具使用簡單,不過在使用前需要做少許代理配置。WiresShark是一款更加強(qiáng)大的工具,使用比較復(fù)雜,而且比較底層,所以在本文中就沒介紹,有興趣的同學(xué)可以自己查閱相關(guān)資料。

  • Charles
  • Fiddler
  • WiresShark

Android Http請求工具庫,這類工具類變化很快,經(jīng)常會(huì)過個(gè)幾年就會(huì)有新的一種工具替換,但是本質(zhì)思想還是一樣的,都是基于URLConnection和HTTP做了一次封裝調(diào)用。

  • URLConnection
  • HttpClient
  • Volley
  • OkHttp

OkHttp相關(guān),這類工具都是基于OkHttp做了二次封裝開發(fā),這個(gè)主要?dú)w功于OkHttp強(qiáng)大開發(fā)模式和架構(gòu),開發(fā)人員可以方便對OkHttp進(jìn)行自定義和二次開發(fā)。工具很強(qiáng)大,不過也有局限性,只能依附于OkHttp的框架,不利于擴(kuò)展到其他平臺(tái)和工具。

  • logging-interceptor
  • Stetho
  • Chuck

工具對比

上面介紹好幾款可以監(jiān)控App網(wǎng)絡(luò)請求的工具,那么如何根據(jù)實(shí)際情況,選擇一款適合自己項(xiàng)目和團(tuán)隊(duì)的工具呢?

Charles & Fiddler

這類工具不依賴與平臺(tái)和App開發(fā)的工具庫,不管你是Android、還是iOS,不管使用的是Volley,還是OkHttp都是可以監(jiān)控的,同時(shí)還支持HTTP的調(diào)試,方便mock數(shù)據(jù),簡直是神器。

不過也有少許缺點(diǎn),比如是不支持Https,如果你的app使用的是https接口,那么這類工具一般情況是不能使用的,不過也有辦法,比如把charles的證書設(shè)置為根證書,則可以檢測到。但是也是有局限的,如果app設(shè)置強(qiáng)制校驗(yàn)https證書,此類方法還是不可行。

因?yàn)槠脚_(tái)無光,可檢測到某個(gè)手機(jī)設(shè)備上面的全部網(wǎng)絡(luò)請求,數(shù)據(jù)量有時(shí)候會(huì)很大,如果經(jīng)常調(diào)試某一個(gè)app,那么域名一般是固定的,可進(jìn)行相對應(yīng)的過濾。

OkHttp相關(guān)

通過標(biāo)題可以看成,此類工具必須依附于OKHttp,那么只能滿足Android平臺(tái)并且App的網(wǎng)絡(luò)請求庫是OkHttp。上面介紹的三款工具,可以選擇性的選擇其中幾種或者是全部,暫時(shí)還沒有發(fā)現(xiàn)沖突的地方。因?yàn)槭侵苯忧度氲酱a中,那么Https也是可以監(jiān)控到。同時(shí)也只能監(jiān)控當(dāng)前設(shè)備上的當(dāng)前應(yīng)用,不可以檢測其他的app。

不過在發(fā)布線上或者正式頒布時(shí),需要手動(dòng)去除這些代碼,否則會(huì)有很大麻煩,同時(shí)也會(huì)把相關(guān)的隱私和安全反饋給使用的用戶。

好了,上面就是關(guān)于App網(wǎng)絡(luò)情況的監(jiān)控工具比較,建議兩個(gè)大分類都可以幾個(gè)或者多個(gè)配合使用,具體問題在根據(jù)具體工具使用,方便問題解決與網(wǎng)絡(luò)監(jiān)控。

其他建議

上面介紹的OkHttp的相關(guān)的工具,都是需要在初始化OkHttpClient的時(shí)候,手動(dòng)添加對應(yīng)的攔截器,如果忘記添加則不會(huì)產(chǎn)生效果。

那么可以使用現(xiàn)在流行的Aop技術(shù),在編譯時(shí)候,會(huì)在所有調(diào)用OkHttpClient的地方,自動(dòng)添加,保證不會(huì)忘記,如果你的App還是用其他的sdk,sdk里面也是用OKhttp的話,也會(huì)監(jiān)控到sdk里面的網(wǎng)絡(luò)請求,不少大廠已經(jīng)使用了這種方法,然后收集請求數(shù)據(jù)到后端,方便管理和優(yōu)化。

下面簡單介紹相關(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)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,794評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,750評論 2 370

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