喜歡小之的文章的能夠關注公衆號「WeaponZhi」持續關注動態php
做爲移動開發工程師,平時開發階段跟接口相關的工做都是要和服務端的小夥伴進行對接的,在對接的過程當中必定會有一些不太方便的地方。html
那麼,今天我要給你們介紹一下「Charles」這款抓包軟件,使用 Charles ,數據接口相關的接口和調試工做將變的高效、簡單、痛快。java
我將具體介紹「查閱接口數據」、「接口數據替換」、「請求重定向」這三個功能在具體開發時候的使用姿式。程序員
這篇文章主要是介紹 Charles 在開發階段的使用方式,突出實用性,至於 Charles 的介紹和配置,不是咱們本文的重點,還沒配置的同窗能夠參考這篇博文,很詳細了:
Charles 使用心得ajax
咱們平時開發的時候,常常要調試接口,須要看一下接口返回的數據。大部分的時候,咱們是經過咱們本身配置的 Log 系統來進行查閱,這種方式雖然是能夠能達到咱們的需求,但實際上仍是比較麻煩的,一些準備工做和操做也比較多,那麼咱們如今擁有了 Charles,一切將變的簡單粗暴,一目瞭然。瀏覽器
咱們配置好了以後,全部的瀏覽器請求都會在 Charles 中顯示,若是你的手機和模擬器也配置好了代理,那麼一樣,模擬器和手機走的全部請求也會被列出來。host 閃過一下黃色標記,表示這個 host 下有一個新的請求剛剛走過。網絡
圖中左側是 Charles 抓到的全部包的彙總,以請求的 host 爲分類,右側是這個請求具體的信息,包括請求頭,返回的數據以及和這個請求相關的全部信息,若是數據是 JSON 格式,那麼它會自動的格式化,若是是圖片流,也會直接把圖片顯示出來等等,你想要有關這個接口的一切,都能一目瞭然。ide
不過有時候,咱們的請求有點太多了,咱們須要觀察的就是一些特殊的 host 的請求。好比在這裏,咱們但願看到的就是「www.jianshu.com」這個 host 下的請求,那麼咱們能夠經過Proxy->Recording Settings
來設置過濾項,不過我通常會直接右擊須要的 host 選中force
進行篩選,以下圖所示:測試
咱們能夠看到,這樣其餘的 host 都會被歸類到Other Hosts
中了。spa
這樣,咱們平時查閱接口信息就會變得簡單粗暴了。
咱們平時在開發過程當中會常常遇到一些狀況。好比你已經開始寫請求的代碼了,但服務端那邊的接口還沒寫好,你的邏輯可能已經寫完卻沒有辦法去測試驗證,你只能乾等或者經過本身在代碼中添加一些假數據來模擬請求,耗時耗力。
或者雖然你接口和服務端調通了,但你想作一些邊界值的測試,想修改請求返回的值或者參數,這不是一件容易的事,每每須要服務端的配合,若是咱們能本身經過某種手段輕鬆的更改返回數據,豈不是一件可以幫助咱們提升代碼容錯率的美事?
Charles 能夠很輕易的辦到。
咱們如今用Retrofit
寫一段簡單的請求代碼:
//舉個栗子!
private void request(){
Api.getDefault(HostType.MESSAGE)//HOST:http://fy.iciba.com/
.getCall()
.subscribe(new BaseObserver<MessageBean>()){
@Override
protected void onSuccess(MessageBean entry) throws Exception{
entry.show();//請求成功展現數據
}
@Override
protected void onFailure(Throwable e, boolean isNetWorkError) throws Exception{
}
});
}複製代碼
這裏的getCall()
方法就是一個簡單的get
請求,完整的請求地址爲:http://fy.iciba.com/ajax.php?a=fy&f=auto&t=auto&w=hello%20world
@GET("ajax.php?a=fy&f=auto&t=auto&w=hello%20world")
Observable<MessageBean> getCall();複製代碼
MessageBean
是這樣的,咱們定義了一個show()
方法來打印出字段:
public class MessageBean {
public int status;
public content content;
public static class content {
public String from;
public String to;
public String out;
public String vendor;
public int errNo;
}
/** 定義 輸出返回數據 的方法 */
public void show() {
LogUtils.i("status:" + status + "\n" +
"from:"+ content.from + "\n" +
"to:"+ content.to + "\n"+
"out:"+ content.out + "\n" +
"vendor:"+ content.vendor + "\n" +
"errNO:"+ content.errNo);
}
}複製代碼
咱們進入應用,在 Charles 中看到的數據是這樣的:
在應用中的日誌顯示是這樣的:
這時候,咱們想修改下from
字段的值該怎麼作呢?很簡單。只需在Tools->Rewrite
中選擇Enable Rewrite
,再 add 一個Rewrite Rule
,在裏面填入你想替換的數據便可:
點擊肯定,咱們從新請求一下,再看一下返回數據:
注意到了嗎,返回的數據真正的被替換掉了,今後之後,咱們本身也能夠輕易模擬數據了!不再用麻煩服務端的小夥伴了!
請求重定向是啥意思吧,咱們設想有這樣一個現實的場景:
服務端的童鞋先把數據的格式定義好了,好比上面的MessageBean
具體的字段先給到咱們了,而後給了咱們一個測試地址和正式地址,但正式地址還沒布好,咱們只能先用測試地址來寫邏輯和測試。
咱們這個時候有了重定向,咱們能夠在寫邏輯的時候,把請求的地址依然用的是正式地址,但經過使用 Charles 的重定向功能,咱們在運行的時候,實際上走的請求是測試地址的請求,等到回頭服務端的童鞋把正式環境布好的時候,咱們不須要特地去代碼中更改請求地址,減小了修改可能形成的出錯可能。
仍是舉例上面的例子,咱們剛剛請求的地址,咱們也有日誌打印出了它的實際請求地址和返回:
咱們如今把這個請求重定向到www.baidu.com
這個地址上,按理說若是重定向成功了,那麼應該是返回百度首頁 html 的頁面代碼數據,咱們實際操做下看看:
咱們將請求地址改爲咱們設置的地址:
@GET("ajax.php")
Observable<MessageBean> getCall();複製代碼
如今咱們從新運行一下,看一下請求日誌:
咱們發現,一樣的地址,返回結果已經不同了,返回的是百度首頁的 html 代碼了。
實際上平時用的最多的就是重定向本地文件了,使用剛剛那個選項下面的「Map Local」操做,和上面操做同樣,只是在 Add 中添加一個本地的 JSON 文件,這樣你在請求的時候直接就能返回本地文件的數據了,這樣作的好處就是,你想改數據,只須要把本地文件修改保存,再次請求,數據就已經變化了,簡直是太方便了。
Charles 還有很是多好用的功能有待你們本身去發掘,好比斷點功能,重發請求功能。這裏再說一個比較好用的功能,那就是模擬慢網的功能。對於咱們平時開發來講,這個功能仍是很實用的,不少時候,一些 bug 都是在這樣的一種特殊狀況才能復現。
打開方式就是Proxy->Start Throttling
,同時經過Proxy->Throttling Settings
能夠進行更細緻的網絡設置。
相信你們已經火燒眉毛的來使用 Charles 了,這款神器能夠說是開發必備。固然,做爲程序員,咱們更應該瞭解到軟件產品產出的不易,但願你們能夠支持正版,尊重他人的勞動成果,從正規渠道進行購買哦。
個人公衆號期待您的關注