一、前言
我們?cè)趇OS開發(fā)的過程中,往往后端和前端都是并行的,當(dāng)后端的接口沒有完善的時(shí)候就會(huì)影響到我們的開發(fā),而我也在我編程的過程中也經(jīng)歷過很多方法去制造假數(shù)據(jù),下面我就一一說一下吧。
二、方法
下面我們以如下的JSON字段進(jìn)行一下說明
{
"code":?0,
"message":?"成功",
"data":?{
"website":"https://www.ianisme.com",
"list":?[
{
"day":?"30",
"month":?"10",
"year":?"2017"
}
]
}
}
2.1 Dictionary假數(shù)據(jù)
這種方法應(yīng)該說是最不建議使用的方法了。假設(shè)我們工程中使用的是JSModel進(jìn)行Model層轉(zhuǎn)換的。
我們需要這樣寫一個(gè)NSDictionary
請(qǐng)點(diǎn)擊此處輸入圖片描述
如圖所示我們就可以這樣去寫假數(shù)據(jù)了。這種方法是每次都要去修改和編輯大量代碼,并且關(guān)于網(wǎng)絡(luò)請(qǐng)求的代碼還測(cè)試不了,不推薦使用。
2.2 搭建后臺(tái)假數(shù)據(jù)
我們可以本地用搭建一個(gè)網(wǎng)站環(huán)境或者使用遠(yuǎn)程服務(wù)器去請(qǐng)求。
我會(huì)保存一個(gè)json文件,然后用一個(gè)php文件去調(diào)用。
header("Content-type:?text/html;?charset=utf-8");
$test?=?$_POST["s"];
$json_string?=?file_get_contents($test?.?'.json');
echo?$json_string;
這種情況下,我們可以直接把a(bǔ)pp端的網(wǎng)絡(luò)請(qǐng)求代碼全部寫好,就相當(dāng)于模仿后臺(tái)的接口一樣,到時(shí)候切換后臺(tái)接口我們只需要更換下接口地址就行了。
2.3APP端修改服務(wù)器數(shù)據(jù)
這里我們以 AFNetworking2.x 為例使用 NSURLProtocol 攔截 HTTP 請(qǐng)求。
創(chuàng)建NSURLProtocol的一個(gè)子類,重寫里面的startLoading方法。
-?(void)startLoading
{
NSMutableURLRequest?*mutableReqeust?=?[[self?request]?mutableCopy];
[NSURLProtocol?setProperty:@YES?forKey:hasInitKey?inRequest:mutableReqeust];
if([mutableReqeust.URL.description?containsString:@"api.ianisme.com"])?{
NSDictionary?*dic?=?@{
@"code":?@0,
@"message":?@"成功",
@"data":?@{
@"website":?@"https://www.ianisme.com",
@"list":?@[
@{
@"day":?@"30",
@"month":?@"10",
@"year":?@"2017"
}
]
}
};
NSData?*tempData?=?[self?toJSONData:dic];
NSString?*jsonString?=?[[NSString?alloc]?initWithData:tempData
encoding:NSUTF8StringEncoding];
NSData?*data?=?[jsonString?dataUsingEncoding:NSUTF8StringEncoding];
NSURLResponse?*response?=?[[NSURLResponse?alloc]?initWithURL:mutableReqeust.URL
MIMEType:@"text/html"
expectedContentLength:data.length
textEncodingName:nil];
[self.client?URLProtocol:self
didReceiveResponse:response
cacheStoragePolicy:NSURLCacheStorageNotAllowed];
[self.client?URLProtocol:self?didLoadData:data];
[self.client?URLProtocolDidFinishLoading:self];
}
else{
self.myConnection?=?[NSURLConnection?connectionWithRequest:mutableReqeust?delegate:self];
}
}
此方法我們可以把相關(guān)網(wǎng)絡(luò)請(qǐng)求寫好,然后本地代碼攔截后臺(tái)的網(wǎng)絡(luò)請(qǐng)求,用假數(shù)據(jù)修改就行了。以上只是一個(gè)原理的演示,實(shí)際開發(fā),推薦使用強(qiáng)大的開源庫OHHTTPStubs, 他可以偽造的網(wǎng)絡(luò)數(shù)據(jù)和模擬的緩慢網(wǎng)絡(luò)來進(jìn)行調(diào)試。
2.4代理攔截網(wǎng)絡(luò)請(qǐng)求
這個(gè)是我比較推薦的一個(gè)方案,不需要修改app端代碼。一切無損對(duì)接后臺(tái)。
這就是利用代理軟件的 Map Local 功能,將請(qǐng)求轉(zhuǎn)換為請(qǐng)求電腦本地的靜態(tài)json文件。
我們以Charles為例,我們把本地的接口寫好之后,我們使用Charles抓一下這個(gè)接口的請(qǐng)求,此時(shí)肯定是失敗的。
如圖:
我們?nèi)?Map Local 指向電腦中的一個(gè)json文件。
如圖:
這樣我們就將此接口指向了電腦本地的一個(gè)json文件,我們可以用此方法,將所有的接口都分別指向本地的各自的 json 文件,當(dāng)后臺(tái)接口完畢后,我們就可以關(guān)閉 Map Local 無縫銜接到真正的后臺(tái)。
三、總結(jié)
以上四個(gè)方法,我的推薦程度是由小到大的。我認(rèn)為最好不要去動(dòng)APP的代碼,所以我推薦第四種,趕快去嘗試一下吧!
?