我在之前一篇博客《網絡抓包工具Charles的介紹與使用》中簡單介紹了Charles的安裝破解,以及進行簡單的Charles抓包配置的介紹。今天我們來詳細介紹下使用Charles進行http抓包,關於https抓包,我將會在另一篇博客中介紹。
(1)http抓包的配置,請參考《網絡抓包工具Charles的介紹與使用》這篇博客。
(2)為了使抓包的結果清晰,便於調試,我寫了一個簡單的網絡請求,通過點擊按鈕請求查詢號碼歸屬地,代碼如下:
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } - (IBAction)networkRequestPressed:(id)sender { NSString *urlAsString = [@"http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode=18888888888&userId=" stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; NSURL *url = [NSURL URLWithString:urlAsString]; NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; [urlRequest setTimeoutInterval:30]; [urlRequest setHTTPMethod:@"GET"]; //推薦使用這種請求方法; NSURLSession *session = [NSURLSession sharedSession]; __block NSString *result = @""; NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (!error) { //沒有錯誤,返回正確; result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"返回正確:%@",result); }else{ //出現錯誤; NSLog(@"錯誤信息:%@",error); } }]; [dataTask resume]; } @end
。
(4)下面開始進行抓包(如何配置請參考:網絡抓包工具Charles的介紹與使用)。注意哦:需要在真機上測試!進行網絡請求後,Charles輸出如下:
。
我現在對上面的http抓包結果進行詳解。
【1】
左側是顯示結構:Structure是樹狀結構顯示,Sequence是水平結構顯示。兩者基本類似,我以樹狀結構來進行介紹。左側的樹狀結構是我進行網絡請求的url鏈接,每一個層級表示了以“/”隔開的子域名。通過上述的代碼也可以看到我GET請求的url鏈接是:http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode=18888888888&userId= ;與樹狀結構中顯示的一致。
【2】
。
右側是詳情頁,其中第一個Overview是概覽。我對一些字段進行介紹:
(1)URL:我進行網絡請求的鏈接;
(2)Status:當前狀態,complete表示請求完成;
(3)Responce Code:返回碼。不同的接口,不同的請求結果,返回碼都不同;
(4)Protocol:使用的協議;
(5)Method:請求方式,如GET請求,POST請求等;
(6)Kept Alive:判斷當前是否正在鏈接(活躍);
(7)Content-Type:發送的內容類型,如這裡用的是XML文本,以UTF8的方式發送;
(8)Client Address:客戶端的IP地址;
(9)Remote Address:遠程服務器的IP;
Timing:
(10)Request Start Time:請求開始的時間;
(11)Request End Time:請求結束的時間;
(12)Response Start Time:返回開始的時間;
(13)Response End Time:返回結束的時間;
Size:
(14)Request Header :請求的頭部大小;
(15)Request Header:返回的頭部大小;
(16)Request : 請求發送的大小;
(17)Response:返回數據的大小;
(18)Total:所有數據大小;
(19)Request Compression :請求壓縮;
(20)Response Compression: 返回壓縮;
【3】
。
第二個頁面是關於請求發送的。下面的Headers,Query String,Raw。
(1)Headers:發送請求的頭部信息;
(2)Query String:發送參數列表;
(3)Raw:發送的原生數據,包括了頭部和參數;
【4】
。
右側的Response的是關於所有返回信息的。
(1)Headers:是返回的頭部信息;
(2)Text:返回信息(除去頭部)後的文本;
(3)Hex:返回信息的16進制表示;
(4)XML:我返回的數據是XML。如果你返回的是JSON,這裡就會顯示JSON;
(5)XML Text:如果你返回JSON,這裡會顯示JSON Text;
(6)Raw:返回的所有原生數據,包括頭部;
【5】
。
裡面是發送數據的一些簡要信息。
【6】
。
是一些簡要信息的圖表表示。
現在我對Charles頂部的一些常用的工具欄做一個介紹:
(1)New Session:新建一個會話。也就是在一個新的Charles界面查看網絡情況;
。
(2)Open Session:打開一個之前保存的會話;
。
(3)Close the current Session:關閉當前的會話;
。
(4)Save the current Session:保存當前的會話;
。
(5)Clear the current Session:清空當前的會話(比較方便,常用);
。
(6)Find Text in the current session:相當於查找功能;
。
總結,通過Charles來抓包網絡請求,讓我們對項目的流程有一個大概的認識,這對於入手一個復雜的項目很有幫助。這也有利於我們測試網絡情況,調試程序,監測性能。同時,網絡抓包也不僅限於iOS的開發,也可以用在其他的開發領域中。當然,可能某些App存在所謂的後門,竊取你手機上的隱私,你是不是也可以通過抓包來判斷呢?我將在下一篇博客中介紹如何進行Charles的https抓包。