最近自己寫(xiě)了一個(gè)Rxjava + Retrofit + okhttp網(wǎng)絡(luò)請(qǐng)求框架,想測(cè)試一下效果脂矫,但是卻沒(méi)有接口來(lái)提供給自己測(cè)試恩沛。這下就尷尬了在扰,雖然可以自己去寫(xiě)一個(gè)后臺(tái),但是這樣做起來(lái)未免太麻煩雷客,費(fèi)時(shí)費(fèi)力芒珠。我是拒絕這么做的,大家應(yīng)該也是拒絕的吧搅裙!那有什么方便快捷的方法來(lái)獲得我們想要的返回?cái)?shù)據(jù)呢皱卓?最好是還能有一個(gè)網(wǎng)絡(luò)請(qǐng)求的過(guò)程。接下來(lái)我們就來(lái)看看如何使用node.js來(lái)快速搭建自己想要的測(cè)試數(shù)據(jù)呈宇。
不知道或者想了解node.js的小伙伴麻煩自行百度一下哈好爬。
首先我們需要先搭建好環(huán)境:先把node.js下載
Node.js安裝包及源碼下載地址為:https://nodejs.org/en/download/。大家根據(jù)自己的系統(tǒng)選擇下載就行
下載后安裝甥啄,安裝過(guò)程非常簡(jiǎn)單存炮,直接下一步,在第五步時(shí)選擇第三個(gè)選項(xiàng)即可蜈漓,
大家也可以按照這個(gè)Node.js安裝教程過(guò)程來(lái)穆桂,安裝完成后,我們來(lái)到cmd命令行工具中融虽,進(jìn)入安裝目錄下(直接打開(kāi)安裝的文件路徑享完,然后在地址欄輸入cmd就直接進(jìn)入了當(dāng)前目錄下)
如上兩圖所示:第一個(gè)為node安裝目錄,找到后再上方地址欄中輸入cmd(如第二圖)然后回車有额,就會(huì)進(jìn)入dos命令窗口般又,并且在node安裝路徑下。
為了檢查node是否安裝成功巍佑,我們可以再dos中輸入 node -v 查看版本號(hào)茴迁,如果能成功查看表明安裝成功。
然后我們?nèi)职惭bnpm: dos窗口中輸入??npm install -g npm? 回車
然后在輸入?npm install -g cnpm? 回車
成功安裝后再安裝? express 應(yīng)用程序生成器
dos窗口中 輸入npm install -g express-generator? 回車
接下來(lái)就是重點(diǎn)了:這一步我們會(huì)安裝一個(gè)express應(yīng)用程序萤衰,你可以先選好安裝在什么位置堕义,取什么名字
比如我這里安裝在D盤(pán)node文件夾下的express文件夾中,取名為yinl脆栋。那么首先我們需要在dos中進(jìn)入D:\node\express目錄
到這個(gè)目錄后我們輸入命令:express --view=pug yinl 回車倦卖,等待成功后,在dos窗口中會(huì)看到如下輸出信息
這時(shí)候我們看文件夾,你會(huì)看到你選擇的安裝目錄下多了個(gè)yinl文件(如下圖)
我們切換到dos窗口椿争,你會(huì)看到下方提示我們安裝東西怕膛,我們按照提示安裝即可
先在dos窗口中輸入cd yinl? 回車
然后 輸入 npm install 回車
然后就可以啟動(dòng)項(xiàng)目了:輸入 npm start? 回車
這個(gè)時(shí)候你就可以在瀏覽器中輸入localhost/3000,見(jiàn)證神奇的時(shí)候到了
看到這個(gè)就證明你成功啦!開(kāi)不開(kāi)心丘薛!哈哈嘉竟,別著急,我們還有事情需要做。
打開(kāi)yinl項(xiàng)目舍扰,你看到的目錄如下圖所示:
這個(gè)時(shí)候倦蚪,瀏覽器打開(kāi)localhost:3000/users,可以看到頁(yè)面顯示respond with a resource
我們好奇找到users文件,在routes目錄下边苹,然后打開(kāi)陵且,
我們可以在routes/users.js文件中自定自己想要得到的返回?cái)?shù)據(jù)
var express = require('express');
var router = express.Router();
//新增數(shù)據(jù)
var data = {
? ? 'code':'200',
? ? 'message':'數(shù)據(jù)獲取成功',
? ? 'lists':[
? ? ? ? {
? ? ? ? ? 'name':'YinL',
? ? ? ? ? ? 'age': '23',
? ? ? ? ? ? 'sex':'男'
? ? ? ? },{
? ? ? ? ? 'name':'yinl',
? ? ? ? ? ? 'age': '20',
? ? ? ? ? ? 'sex':'女'
? ? ? ? }
? ? ]
}
/* GET users listing. */
router.get('/', function(req, res, next) {
? res.send(data);? //修改
});
module.exports = router;
改后之后,因?yàn)橛芯彺娴脑蚋鍪覀冃枰匦聠?dòng)node(dos進(jìn)入項(xiàng)目根目錄下慕购,重新運(yùn)行npm start),然后打開(kāi)
到這里就算基本完成啦,但是就這樣的話茬底,你會(huì)發(fā)現(xiàn)每次都要來(lái)修改這個(gè)文件沪悲,修改后都需要重新啟動(dòng),非常的不方便阱表。接下來(lái)我們就來(lái)繼續(xù)改進(jìn)殿如。在項(xiàng)目下新建一個(gè)config文件夾并新建一個(gè)api.js,配置一下:
api.js內(nèi)容如下:
var fs = require('fs');
/**
* 檢查請(qǐng)求的路徑是否存在
* @param apiName 請(qǐng)求路徑
* @param method? 請(qǐng)求方式
* @param params? 請(qǐng)求參數(shù)
* @param res 返回請(qǐng)求
*/
function getDataFromPath (apiName,method,params,res){
? ? if(apiName){
? ? ? ? fs.access(
? ? ? ? ? ? // 提取請(qǐng)求路徑中的js文件
? ? ? ? ? ? apiName.substring(1)+'.js',
? ? ? ? ? ? // 回調(diào)函數(shù),檢查請(qǐng)求的路徑是否有效失敗返回一個(gè)錯(cuò)誤參數(shù)
? ? ? ? ? ? function(err){
? ? ? ? ? ? ? ? if(!err){
? ? ? ? ? ? ? ? ? ? // 每次請(qǐng)求都清除模塊緩存重新請(qǐng)求
? ? ? ? ? ? ? ? ? ? delete require.cache[require.resolve('..'+apiName)];
? ? ? ? ? ? ? ? ? ? try{
? ? ? ? ? ? ? ? ? ? ? ? addApiResult(res,require('..'+apiName).getData(method,params));
? ? ? ? ? ? ? ? ? ? }catch(e){
? ? ? ? ? ? ? ? ? ? ? ? console.error(e.stack);
? ? ? ? ? ? ? ? ? ? ? ? res.status(500).send(apiName+' has an error,please check the code.');
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? addApiResult(res);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? );
? ? }else{
? ? ? ? addApiResult(res);
? ? }
};
/**
*? 響應(yīng)頭
* @param res
*/
function addApiHead(res){
? ? res.setHeader('Content-Type', 'application/json;charset=utf-8');
? ? // 跨域
? ? res.header('Access-Control-Allow-Origin', '*');
? ? res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
? ? res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
? ? // 控制http緩存
? ? res.header("Cache-Control", "no-cache, no-store, must-revalidate");
? ? res.header("Pragma", "no-cache");
? ? res.header("Expires", 0);
}
/**
* 返回參數(shù)最爬,如無(wú)返回參數(shù)返回404
* @param res
* @param result
*/
function addApiResult(res,result){
? ? if(result){
? ? ? ? res.send(result);
? ? }else{
? ? ? ? res.status(404).send();
? ? }
}
/*請(qǐng)求方式*/
// get
exports.get = function(req, res){
? ? addApiHead(res);
? ? getDataFromPath(req.path,'GET',req.query,res);
};
// post
exports.post = function(req, res){
? ? addApiHead(res);
? ? getDataFromPath(req.path,'POST',req.body,res);
};
然后打開(kāi)根目錄下app.js文件涉馁,在上面引入剛剛新建的文件api.js
//引入APIvarapi =require('./config/api');
并替換配置
/*配置請(qǐng)求*/
app.get('/',function(req, res){
?res.send('hello world');});
app.get('/api/*', api.get);
app.post('/api/*', api.post);
下方分別為修改之前和修改之后的內(nèi)容
然后我們?cè)诟夸浶陆╝pi文件夾,在其中新建test.js;
test.js文件中寫(xiě)上你想要的數(shù)據(jù)即可爱致。
exports.getData = function(method,data){
? ? var backData={
"success":'true',
? ? ? ? "code":'000',
? ? ? ? "message":"",
"data":{
"total":'2',
"users":[
{
? ? ? ? ? ? 'name':'YinL',
? ? ? ? ? ? 'age': '23',
? ? ? ? ? ? 'sex':'男'
},
? ? {
? ? ? ? ? ? 'name':'yinl',
? ? ? ? ? ? 'age': '20',
? ? ? ? ? ? 'sex':'女'
}
]}
? ? }
? ? return JSON.stringify(backData);
}
這里完成后烤送,你就可以重新運(yùn)行npm start,如果這個(gè)時(shí)候能成功運(yùn)行糠悯,在瀏覽器打開(kāi)http://localhost:3000/api/test帮坚,你就會(huì)看到返回的json。我這邊出現(xiàn)了錯(cuò)誤
這是因?yàn)闆](méi)有安裝這個(gè)依賴互艾,我們安裝就好了:npm install serve-favicon --save? 回車,安裝完成后如下圖所示
這個(gè)時(shí)候我們?cè)趩?dòng)項(xiàng)目 npm start
我們看到成功啟動(dòng)了叶沛,如果出現(xiàn)了錯(cuò)誤的話,大家對(duì)應(yīng)解決然后在啟動(dòng)就好忘朝。在瀏覽器打開(kāi)http://localhost:3000/api/test,會(huì)看到成功的出來(lái)數(shù)據(jù)啦判帮!哦也!
這個(gè)時(shí)候局嘁,你想添加其他數(shù)據(jù),只需要在api目錄下去新建其他.js文件就可以啦晦墙!添加后可以直接訪問(wèn)的哦悦昵。
如果你想完全模仿線上的接口,你只需要一層層的建立文件夾就ok啦晌畅!假如線上接口是?https://www.yinl.com/mydata/school/data,我們?cè)赼pi文件夾按照路徑新建文件夾和文件即可:api-->mydata-->school-->data.js
如果你想用android studio來(lái)測(cè)試下數(shù)據(jù)但指,你只需要把localhost替換成你本機(jī)電腦的ip就ok啦,例如:
http://192.168.x.xxx:3000/api/test? (把這個(gè)ip地址換成你本機(jī)的)
? 下方為我在android studio測(cè)試的數(shù)據(jù)返回(這是新寫(xiě)的請(qǐng)求框架,有想要的小伙伴嘛?)
可以看到我這里成功的通過(guò)android studio訪問(wèn)到我自定義的數(shù)據(jù)啦棋凳,這個(gè)log顯示的信息也一目了然拦坠,新寫(xiě)的這個(gè)Rxjava + Retrofit + okhttp 網(wǎng)絡(luò)請(qǐng)求框架有想要的小伙伴請(qǐng)留言哦,后續(xù)我也可能會(huì)寫(xiě)對(duì)應(yīng)的博客的剩岳!
希望這篇文章能夠給大家?guī)?lái)幫助贞滨,有啥問(wèn)題歡迎留言!感謝大家的閱讀拍棕!