iOS開發——使用Charles進行http網路抓包詳解
我在之前一篇部落格《網路抓包工具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
(3)點擊按鈕進行網路請求後,返回結果如下:
。
(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抓包。