最近在進行前端開發的時候發現Charles一個非常牛叉的功能,就是可以通過代理將網絡請求定向至本地文件。有了這個功能在進行iOS開發時就可以在缺少后台接口的情況下更加真實的進行數據mock了(反正我們公司的后台。。。不想吐槽了)。
我們先用NSURLSession發送一段簡單的post請求:
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://192.123.0.123:8080/login"] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10.0f]; request.HTTPMethod = @"POST"; request.HTTPBody = [@"username=123456&password=123456" dataUsingEncoding:NSUTF8StringEncoding]; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSLog(@"error : %@",error); }]; [task resume];
創建一個request對象,設置它的url為http://192.123.0.123:8080/login,當然其實這個url是不存在,因為它還沒有被“實現”,設置網絡請求緩存策略為忽視本地緩存數據直接請求服務端,超時時間為10秒,請求類型為post請求,body中的參數為username和password。之后創建一個會話對象session,並用這個會話對象創建一個task,最后通過[task resume]執行這個task任務,結果當然是沒有結果。。。
打印error信息發現請求超時,我們通過Charles抓取了網絡請求包,結果如下:
很明顯,一個沒有被“實現"的URL請求不到數據是理所當然的,但是我們通過Charles中的map local選項可以為這個沒有被“實現”的URL偽造一份數據。
右鍵我們的網絡請求包,然后將出現的列表拉到最下方選擇map local選項。
在彈出的對話框中選擇你想要將該請求指向的本地文件。
在這里我將該請求指向了桌面上一個叫做Directions.json的json文件,文件內容很簡單。
在我們進行以上操作之后再來進行一次請求,結果如下:
Directions.json文件中的數據被當作請求的結果返回一個本不應該得到返回的請求在經過map后返回了我們自定義的數據,當然Charles並不僅僅只是能將請求指向本地文件而已,還可以通過map remote功能將請求指向另一個地址。在掌握這些功能后,當我們在開發中需要模擬一些極端的情況時,就可以更好的進行調試了。