0x01.Why?
做移動測試的同學經常會在app和server中間架設一個代理(例如charles或者fiddler等),由經代理,app和server之間的交互及交互內容變得可視化,使得我們不再摸黑測試。事實上,能夠很好的掌握app和server端的交互不僅對于測試,對于開發(fā),對于產品的整個質量提高都是有非常大益處的。但是,有些場景下,架設代理變得不易,或者難于滿足要求,舉幾個例子:
想要找出正常用戶使用時候,哪些場景最耗流量(你不能讓用戶掛代理,如果有針對網絡流量的優(yōu)化,掛代理也看不出問題來)。
想要找出請求的各種接口中,哪些服務不穩(wěn)定,如間歇出現4xx或者5xx錯誤,這需要統(tǒng)計大量的數據,單一客戶端掛代理是做不到的(當然服務端監(jiān)控如果做得好也能實現)。
想要找出某些特定條件下(如弱網,網絡切換等)客戶端自己產生的請求錯誤或者超時等等。
想要查看一些特殊場景下接口是否會發(fā)生重復調用,錯誤調用序列。這些issue往往藏的很深,不易出現。這時候往往需要分析日志的pattern來把問題揪出來,這時候你就會發(fā)現,代理軟件做日志分析很麻煩,也要導出來專門分析,而且總掛著代理極為不方便(至少不能切換網絡,日志也要根據app做篩查,因為一般都是全流量截?。?。
這時候需求就變成了:最好在app內部能夠截取所有的HTTP/HTTPS流量,以某種方式保存下來,并且能夠以某種方式傳遞給需要用這些數據的人。這其實是一種APM(Application Performance Monitoring)的概念,國外最早已經有人實現了這種功能,如 newrelic https://newrelic.com/ 國內也有一些類似的廠商了。
0x02. How?
先想一下我們每天都在使用的代理工具是如何實現的呢?代理工具會攔截所有的http的請求,記錄下我們需要的信息后替代客戶端重新發(fā)送相同的請求給服務端;攔截返回,記錄下想要的東西后返回給客戶端。如果JAVA寫的多,你可能看到過各種 interceptor 來截取流量。OKHttp的作者介紹這款被廣泛應用的http client的時候曾經說過:OKHttp只不過是請求和響應之間做了一堆interceptor而已。