我是服務(wù)器小白。不了解真正的服務(wù)器是怎么搭建的迁沫。但是小編在本文將會(huì)講述如何在十分鐘內(nèi)芦瘾,在自己的電腦上搭建出服務(wù)器。并帶領(lǐng)大家使用搭建好的服務(wù)器集畅〗埽總之,干貨滿(mǎn)滿(mǎn)挺智。
本文源碼點(diǎn)此下載:源碼
注:本文客戶(hù)端使用AFNetworking框架來(lái)請(qǐng)求測(cè)試服務(wù)器數(shù)據(jù)藐吮。
本文目錄
1. 搭建測(cè)試服務(wù)器
2. 測(cè)試POST、GET網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求
3. 在實(shí)際項(xiàng)目中的運(yùn)用
1. 搭建測(cè)試服務(wù)器
小編選擇moco基于 Java 開(kāi)發(fā)的開(kāi)源項(xiàng)目來(lái)搭建測(cè)試服務(wù)器逃贝。
moco使用的場(chǎng)景是什么呢谣辞?
- 我是一個(gè)企業(yè)級(jí)軟件開(kāi)發(fā)人員,每次面對(duì)集成就是我頭疼開(kāi)始的時(shí)候沐扳,漫長(zhǎng)集成拉鋸戰(zhàn)拖延了我們的進(jìn)度泥从。幸好有了moco剑辫,幾行配置就可以模擬一個(gè)服務(wù)钧椰,我再也不需要看集成服務(wù)團(tuán)隊(duì)的臉色了葵诈。
- 我是一個(gè)移動(dòng)開(kāi)發(fā)人員涤伐,老板催得緊,可服務(wù)器端開(kāi)發(fā)進(jìn)度慢厘唾,我空有一個(gè)漂亮的iPhone應(yīng)用闸盔,發(fā)揮不出作用扳还。幸好有了moco哄陶,很快就可以搭建出一個(gè)模擬服務(wù)帆阳,我再也不用把生命浪費(fèi)在無(wú)效的等待上了。
- 我是一個(gè)前端開(kāi)發(fā)人員屋吨,做Inception的時(shí)候蜒谤,客戶(hù)總想看到一個(gè)完整的應(yīng)用演示,可哪有時(shí)間開(kāi)發(fā)后端服務(wù)爸寥拧鳍徽!幸好有了moco,幾下就可以弄出一個(gè)模擬服務(wù)敢课,我做的頁(yè)面一下就有了生命力阶祭。
moco搭建出模擬服務(wù)器是不是很麻煩氨炼拧?
moco有兩種使用模式:
- API 模式
- 獨(dú)立運(yùn)行模式
如果你編寫(xiě)的是個(gè)Java應(yīng)用(或是以其它JVM上的語(yǔ)言編寫(xiě)的應(yīng)用)濒募,你可以采用直接調(diào)用API接剩。
本文采用的是獨(dú)立運(yùn)行模式,點(diǎn)擊此處下載moco服務(wù)端(其實(shí)就是一個(gè)jar包)萨咳,當(dāng)然你可以從官網(wǎng)下載源代碼按照官網(wǎng)的說(shuō)明編譯生成jar包。小編不想搞的過(guò)于復(fù)雜疫稿,我們需要的快速搭建測(cè)試服務(wù)器培他。小編選擇直接下載jar包。
測(cè)試打印Hello world!
注意:為了易于表述遗座,小編在桌面上創(chuàng)建moco-server文件夾舀凛,我把剛才下載的moco-runner-0.10.2-standalone.jar。其中0.10.2代表的是當(dāng)前的版本號(hào)途蒋。
moco-server文件夾里猛遍,創(chuàng)建一個(gè)test.json文件(.json是文件后綴)。
在文件里輸入以下內(nèi)容后保存号坡。
[
{
"response": {
"text": "Hello world!"
}
}
]
注:一定要是英文 " 引號(hào) 懊烤,否則會(huì)報(bào)錯(cuò)。使用文件編輯經(jīng)常會(huì)莫名其妙的改變引號(hào)宽堆,所以小編建議使用
右鍵-打開(kāi)方式-選擇Xcode
編輯內(nèi)容腌紧。
打開(kāi)終端,輸入以下內(nèi)容:
//指向moco-server當(dāng)前目錄
cd /Users/macOne/Desktop/moco-server
回車(chē)后再輸入以下內(nèi)容:
java -jar moco-runner-0.10.2-standalone.jar start -p 12306 -c test.json
出現(xiàn)下圖表示運(yùn)行成功:
在瀏覽器流輸入:http://localhost:12306
可以看到"Hello World!"字樣畜隶。
說(shuō)明模擬服務(wù)器是可以正常使用的壁肋。到此服務(wù)器就搭建完畢了。是不是很簡(jiǎn)單籽慢!
2. 測(cè)試POST浸遗、GET網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求
小編將一步步帶你使用配置文件配置網(wǎng)絡(luò)請(qǐng)求和響應(yīng)數(shù)據(jù)。
小編在本篇文章介紹客戶(hù)端常用Http請(qǐng)求方法 Get
和 Post
箱亿。moco同樣也支持PUT
跛锌、 DELETE
方法。
-
Get 方法 不帶參數(shù)
在test.json里輸入一下內(nèi)容
[
{
"response": {
"text": "Hello world!"
}
},
{
"request": {
"method" : "get",
"uri": "/getMethod"
},
"response": {
"text": "This is a Get Method!"
}
}
]
在瀏覽器里輸入http://localhost:12306/getMethod
回車(chē)后結(jié)果如下:
This is a Get Method!
request 請(qǐng)求
有14個(gè)固定的屬性:method
,headers
,json
,factory
,uri
,text
,cookies
,xpaths
,json_paths
,version
,file
,queries
,path_resource
,forms
届惋。一定要遵循這些方法察净。 常用的method(請(qǐng)求方式)
,headers(heads參數(shù))
,uri(url地址)
,file(指定調(diào)用的請(qǐng)求文件)
,queries(請(qǐng)求帶參)
,forms(表單內(nèi)容)
盼樟。response 響應(yīng)
有12個(gè)固定屬性:status
,attachment
,headers
,version
,factory
,file
,text
,proxy
,cookies
,json
,latency
,path_resource
氢卡。
在本篇文章中用到file
,text
。
通過(guò)命令返回的數(shù)據(jù)晨缴,可以看到當(dāng)前的數(shù)據(jù)請(qǐng)求和返回的信息:
-
Get方法 帶參數(shù)
默認(rèn)的請(qǐng)求方式是Get译秦,你可以不用寫(xiě)method
。
{
"request": {
"uri": "/getMethodWithParams",
"queries": {
"param1": "1",
"param2": "2"
}
},
"response": {
"text": "This is a method with params!"
}
}
注意同一級(jí)的屬性后要有 " , ",支持運(yùn)行過(guò)程中編輯文件內(nèi)容筑悴。編輯的內(nèi)容是否合法在終端上會(huì)有提示们拙。
在瀏覽器里輸入http://localhost:12306/getMethodWithParams?param1=1¶m2=2
回車(chē)后結(jié)果如下:
This is a method with params!
- Post 方法
寫(xiě)一個(gè)復(fù)雜的帶有headers,body的Post 請(qǐng)求方法:
{
"request": {
"method" : "post",
"uri": "/postMethod",
"headers" : {
"content-type" : "application/json",
"sessionid": "e566288ba77de98d"
},
"forms" :{
"name" : "Airfei",
"password" : "123456"
}
},
"response": {
"text": "This is a POST Method!"
}
}
小編是通過(guò)Paw http客戶(hù)端請(qǐng)求工具進(jìn)行驗(yàn)證。
以上就是常用的使用配置數(shù)據(jù)方法阁吝。此test.json文件從此處查看砚婆。
3. 在實(shí)際項(xiàng)目中的運(yùn)用
我要?jiǎng)?chuàng)建一個(gè)項(xiàng)目,結(jié)合此項(xiàng)目使用moco服務(wù)器突勇。此項(xiàng)目中包括登陸界面和資產(chǎn)列表界面装盯。
在實(shí)際項(xiàng)目中,請(qǐng)求接口數(shù)據(jù)比較多甲馋。因此把所有的配置放在同一個(gè)文件里埂奈,是非常不合適的。需要進(jìn)行全局配置定躏,參見(jiàn)官網(wǎng)的Global Settings账磺。
前期準(zhǔn)備,寫(xiě)配置文件
在moco-server文件夾創(chuàng)建settings.json
,同時(shí)創(chuàng)建login和asset兩個(gè)文件夾(為了方便查找)痊远。
- 在login文件夾內(nèi)創(chuàng)建
login.json
和login_response.json
兩個(gè)文件垮抗。 - 在asset文件夾內(nèi)創(chuàng)建
assetList.json
和assetList_response.json
兩個(gè)文件。
- 在
settings.json
文件輸入以下內(nèi)容:
//是不是像導(dǎo)入文件頭文件
[
{
"include" : "login/login.json"
},
{
"include" : "asset/assetList.json"
}
]
-
login.json
輸入以下內(nèi)容:
[
{
"request" :
{
"uri" : "/assetApp/login",
"method" : "get",
"queries" :
{
"username" : "Airfei",
"password" : "123456"
}
},
"response" :
{
"file" : "./login/login_response.json"
}
}
]
-
login_response.json
輸入以下內(nèi)容:
//返回結(jié)果OK
[
{
"status" : "OK"
}
]
-
assetList.json
內(nèi)容
//請(qǐng)求資產(chǎn)列表接口
[
{
"request" :
{
"uri" : "/assetApp/assetList",
"method" : "post",
"headers" : {
"content-type" : "application/json",
"sessionid": "e566288ba77de98d"
}
},
"response" :
{
"file" : "./asset/assetList_response.json"
}
}
]
-
assetList_response.json
內(nèi)容
//資產(chǎn)列表清單
[
{
"assettype": "TD固定資產(chǎn)",
"assetname": "空調(diào)",
"assetcode": "4435-22333111",
"barcode": "4435-22333111",
"manufacturer": "天津市xxxxx",
"unit": "臺(tái)",
"amount": "2",
"addrname": "河北省xxxxxxx",
"cost": "3500"
},
{
"assettype": "TD固定資產(chǎn)",
"assetname": "電腦",
"assetcode": "4435-2234566",
"barcode": "4435-2234566",
"manufacturer": "北京市xxxxx",
"unit": "臺(tái)",
"amount": "7",
"addrname": "河北省xxxxxxx",
"cost": "4500"
},
{
"assettype": "TD固定資產(chǎn)",
"assetname": "飲水機(jī)",
"assetcode": "4735-22333123",
"barcode": "4735-22333123",
"manufacturer": "上海市xxxxx",
"unit": "臺(tái)",
"amount": "5",
"addrname": "河北省xxxxxxx",
"cost": "1250"
},
{
"assettype": "TD固定資產(chǎn)",
"assetname": "打印機(jī)",
"assetcode": "4435-2334567",
"barcode": "4435-2334567",
"manufacturer": "天津市xxxxx",
"unit": "臺(tái)",
"amount": "5",
"addrname": "河北省xxxxxxx",
"cost": "2760"
},
{
"assettype": "TD固定資產(chǎn)",
"assetname": "電腦桌",
"assetcode": "4435-2267998",
"barcode": "4435-2267998",
"manufacturer": "天津市xxxxx",
"unit": "臺(tái)",
"amount": "4",
"addrname": "河北省xxxxxxx",
"cost": "650"
},
{
"assettype": "TD固定資產(chǎn)",
"assetname": "手機(jī)",
"assetcode": "4435-22345881",
"barcode": "4435-22345881",
"manufacturer": "天津市xxxxx",
"unit": "臺(tái)",
"amount": "2",
"addrname": "河北省xxxxxxx",
"cost": "5500"
},
{
"assettype": "TD固定資產(chǎn)",
"assetname": "柜式空調(diào)",
"assetcode": "4435-6666444",
"barcode": "4435-6666444",
"manufacturer": "天津市xxxxx",
"unit": "臺(tái)",
"amount": "1",
"addrname": "河北省xxxxxxx",
"cost": "8800"
},
{
"assettype": "TD固定資產(chǎn)",
"assetname": "立式衣架",
"assetcode": "4435-8944444",
"barcode": "4435-8944444",
"manufacturer": "天津市xxxxx",
"unit": "個(gè)",
"amount": "2",
"addrname": "河北省xxxxxxx",
"cost": "300"
},
{
"assettype": "TD固定資產(chǎn)",
"assetname": "加濕器",
"assetcode": "4435-3277778",
"barcode": "4435-3277778",
"manufacturer": "天津市xxxxx",
"unit": "臺(tái)",
"amount": "5",
"addrname": "河北省xxxxxxx",
"cost": "180"
},
{
"assettype": "TD固定資產(chǎn)",
"assetname": "轉(zhuǎn)椅",
"assetcode": "4435-7844442",
"barcode": "4435-7844442",
"manufacturer": "天津市xxxxx",
"unit": "個(gè)",
"amount": "14",
"addrname": "河北省xxxxxxx",
"cost": "400"
}
]
配置完以上內(nèi)容后在終端里輸入以下方法
cd /Users/macOne/Desktop/moco-server
//注意 -g 不是 -c
java -jar moco-runner-0.10.2-standalone.jar start -p 12306 -g settings.json
得到以下內(nèi)容說(shuō)明你的配置文件沒(méi)有錯(cuò)誤碧聪。Server is started!
INFO Server is started at 12306
INFO Shutdown port is 51783
創(chuàng)建客戶(hù)端并使用AFNetwoking網(wǎng)絡(luò)請(qǐng)求
登錄界面其實(shí)輸入用戶(hù)名和密碼請(qǐng)求服務(wù)器驗(yàn)證是否通過(guò)借宵。其實(shí)也可以返回一些認(rèn)證信息。用于校驗(yàn)以后的所有請(qǐng)求的合法性矾削。
客戶(hù)端上的登錄數(shù)據(jù)請(qǐng)求代碼:
-(void)requestLogin
{
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
NSString *url=@"http://localhost:12306/assetApp/login";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//請(qǐng)求所帶參數(shù)
NSDictionary *dic = @{@"username":_name,
@"password":_pwd
};
[manager GET:url parameters:dic success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) {
NSString *receiveStr = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
NSData * data = [receiveStr dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
hud.mode = MBProgressHUDModeText;
hud.labelText = @"登錄成功";
hud.removeFromSuperViewOnHide = YES;
NSLog(@"result:%@",jsonDict);
//做一個(gè)處理,1秒后刷新壤玫。也可以不用加
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//隱藏hub
[hud hide:YES];
//轉(zhuǎn)到下一界面
[[AppDelegate shareDelegate] setupMainViewController];
});
} failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
hud.mode = MBProgressHUDModeText;
hud.labelText = @"登錄失敗";
hud.removeFromSuperViewOnHide = YES;
[hud hide:YES afterDelay:1.0];
NSLog(@"登錄失敗");
}];
}
登錄成功后,進(jìn)入資產(chǎn)列表界面哼凯。POST請(qǐng)求服務(wù)器獲取資產(chǎn)列表數(shù)據(jù),在請(qǐng)求數(shù)據(jù)需要帶上headers參數(shù)用于驗(yàn)證請(qǐng)求的合法性欲间。請(qǐng)求代碼如下:
-(void)requestAssetList
{
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
NSString *url=@"http://localhost:12306/assetApp/assetList";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//帶有headers參數(shù)
[manager.requestSerializer setValue:@"e566288ba77de98d" forHTTPHeaderField:@"sessionid"];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[manager POST:url parameters:nil success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) {
NSString *receiveStr = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
NSData * data = [receiveStr dataUsingEncoding:NSUTF8StringEncoding];
_assetArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
//做一個(gè)處理,1秒后刷新。模擬請(qǐng)求數(shù)據(jù)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//刷新界面
[_tableView reloadData];
//隱藏hub
[hud hide:YES];
});
} failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
hud.mode = MBProgressHUDModeText;
hud.labelText = @"請(qǐng)求資產(chǎn)列表失敗";
hud.removeFromSuperViewOnHide = YES;
[hud hide:YES afterDelay:1.0];
}];
}
源碼點(diǎn)擊這里獲得断部。
如果覺(jué)得文章還不錯(cuò)猎贴,請(qǐng)點(diǎn)一波關(guān)注吧!干貨系列會(huì)繼續(xù)給你帶來(lái)更多實(shí)用的東西蝴光。